[OpenCV] IplImage and Operation

IplImage


一、资源

In this chapter, APIs will make U crazy. Good luck! Next, Review Linear Algebra.

Ref: http://blog.csdn.net/u012269327/article/category/2291085【学习Opencv笔记】

 

 

二、IplImage 

  • Data structure

"modules/core/include/opencv2/core/types_c.h"

typedef struct _IplImage
{
    int  nSize;             /* sizeof(IplImage) */
    int  ID;                /* version (=0)*/
    int  nChannels;         /* Most of OpenCV functions support 1,2,3 or 4 channels */
    int  alphaChannel;      /* Ignored by OpenCV */
    int  depth;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
                               IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
    char colorModel[4];     /* Ignored by OpenCV */
    char channelSeq[4];     /* ditto */
    int  dataOrder;         /* 0 - interleaved color channels 隔行扫描, 1 - separate color channels .
                               cvCreateImage can only create  images */
    int  origin;            /* 0 - top-left origin,
                               1 - bottom-left origin (Windows bitmaps style).  */
    int  align;             /* Alignment of image rows (4 or 8).
                               OpenCV ignores it and uses widthStep instead.    */
    int  width;             /* Image width in pixels.                           */
    int  height;            /* Image height in pixels.                          */
    struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. 函数的操作被限定在一小块区域*/
    struct _IplImage *maskROI;      /* Must be NULL. */
    void  *imageId;                 /* "           " */
    struct _IplTileInfo *tileInfo;  /* "           " */
    int  imageSize;         /* Image data size in bytes
                               (==image->height*image->widthStep
                               in case of interleaved data)*/
    char *imageData;        /* Pointer to aligned image data.         */
    int  widthStep;         /* Size of aligned image row in bytes.    */
    int  BorderMode[4];     /* Ignored by OpenCV.                     */
    int  BorderConst[4];    /* Ditto.                                 */
    char *imageDataOrigin;  /* Pointer to very origin of image data
                               (not necessarily aligned) -
                               needed for correct deallocation */
}
IplImage;

 

 

三、局部区域操作

  • 单区域操作 - ROI
#include <highgui.h>

int main(void) { IplImage* src; cvNamedWindow("Example3_12_pre", CV_WINDOW_AUTOSIZE); cvNamedWindow("Example3_12_post", CV_WINDOW_AUTOSIZE); if(((src=cvLoadImage("/home/unsw/lolo.jpg",1)) != 0 )) { int x = atoi("10"); int y = atoi("20"); int width = atoi("50"); int height = atoi("100"); int add = atoi("100"); cvShowImage( "Example3_12_pre", src);
cvSetImageROI(src, cvRect(x,y,width,height)); // 设置专注范围 cvAddS(src, cvScalar(add,
0, 0, 0), src, NULL);  // 只在专注的范围执行函数 cvResetImageROI(src);   // 如果注销,下一个函数(显示图像)则只会显示指定区域
cvShowImage(
"Example3_12_post",src); cvWaitKey(5000); } cvReleaseImage( &src ); cvDestroyWindow("Example3_12_pre"); cvDestroyWindow("Example3_12_post"); return 0; }

 

  • 多区域同时处理

但以下方式更加灵活,方便实现多区域同时处理。

int main(int argc, char** argv)
{
    IplImage* interest_img;
    CvRect interest_rect;
    if( argc == 7 && ((interest_img=cvLoadImage(argv[1],1)) != 0 ))
    {
        interest_rect.x = atoi(argv[2]);
        interest_rect.y = atoi(argv[3]);
        interest_rect.width = atoi(argv[4]);
        interest_rect.height = atoi(argv[5]);
        int add = atoi(argv[6]);

        // Assuming IplImage *interest_img; and 
        //  CvRect interest_rect;
        //  Use widthStep to get a region of interest
        //
        // (Alternate method)
        //
        IplImage *sub_img = cvCreateImageHeader(
          cvSize(
             interest_rect.width, 
             interest_rect.height
          ),
          interest_img->depth, 
          interest_img->nChannels
        );
        
        sub_img->origin = interest_img->origin;
        
        sub_img->widthStep = interest_img->widthStep;
        
        sub_img->imageData = interest_img->imageData + 
            interest_rect.y * interest_img->widthStep  +
            interest_rect.x * interest_img->nChannels;
        
        cvAddS( sub_img, cvScalar(add), sub_img );
        
        cvReleaseImageHeader(&sub_img);

        cvNamedWindow( "Roi_Add", CV_WINDOW_AUTOSIZE );
        cvShowImage( "Roi_Add", interest_img );
        cvWaitKey();
    }
    return 0;
}

  

 

四、矩阵图像处理函数 

全部API

1、cvLoadImage:将图像文件加载至内存;

2、cvNamedWindow:在屏幕上创建一个窗口;

3、cvShowImage:在一个已创建好的窗口中显示图像;

4、cvWaitKey:使程序暂停,等待用户触发一个按键操作;

5、cvReleaseImage:释放图像文件所分配的内存;

6、cvDestroyWindow:销毁显示图像文件的窗口;

7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件;

8、cvQueryFrame:用来将下一帧视频文件载入内存;

9、cvReleaseCapture:释放CvCapture结构开辟的内存空间;

10、cvCreateTrackbar:创建一个滚动条;

11、cvSetCaptureProperty:设置CvCapture对象的各种属性;

12、cvGetCaptureProperty:查询CvCapture对象的各种属性;

13、cvGetSize:当前图像结构的大小;

14、cvSmooth:对图像进行平滑处理;

15、cvPyrDown:图像金字塔,降采样,图像缩小为原来四分之一;

16、cvCanny:Canny边缘检测;

17、cvCreateCameraCapture:从摄像设备中读入数据;

18、cvCreateVideoWriter:创建一个写入设备以便逐帧将视频流写入视频文件;

19、cvWriteFrame:逐帧将视频流写入文件;

20、cvReleaseVideoWriter:释放CvVideoWriter结构开辟的内存空间;

21、CV_MAT_ELEM:从矩阵中得到一个元素;

22、cvAbs:计算数组中所有元素的绝对值;

23、cvAbsDiff:计算两个数组差值的绝对值;

24、cvAbsDiffS:计算数组和标量差值的绝对值;

25、cvAdd:两个数组的元素级的加运算;

26、cvAddS:一个数组和一个标量的元素级的相加运算;

27、cvAddWeighted:两个数组的元素级的加权相加运算(alpha运算);

28、cvAvg:计算数组中所有元素的平均值;

29、cvAvgSdv:计算数组中所有元素的绝对值和标准差;

30、cvCalcCovarMatrix:计算一组n维空间向量的协方差;

31、cvCmp:对两个数组中的所有元素运用设置的比较操作;

32、cvCmpS:对数组和标量运用设置的比较操作;

33、cvConvertScale:用可选的缩放值转换数组元素类型;

34、cvCopy:把数组中的值复制到另一个数组中;

35、cvCountNonZero:计算数组中非0值的个数;

36、cvCrossProduct:计算两个三维向量的向量积(叉积);

37、cvCvtColor:将数组的通道从一个颜色空间转换另外一个颜色空间;

38、cvDet:计算方阵的行列式;

39、cvDiv:用另外一个数组对一个数组进行元素级的除法运算;

40、cvDotProduct:计算两个向量的点积;

41、cvEigenVV:计算方阵的特征值和特征向量;

42、cvFlip:围绕选定轴翻转;

43、cvGEMM:矩阵乘法;

44、cvGetCol:从一个数组的列中复制元素;

45、cvGetCols:从数据的相邻的多列中复制元素;

46、cvGetDiag:复制数组中对角线上的所有元素;

47、cvGetDims:返回数组的维数;

48、cvGetDimSize:返回一个数组的所有维的大小;

49、cvGetRow:从一个数组的行中复制元素值;

50、cvGetRows:从一个数组的多个相邻的行中复制元素值;

51、cvGetSize:得到二维的数组的尺寸,以CvSize返回;

52、cvGetSubRect:从一个数组的子区域复制元素值;

53、cvInRange:检查一个数组的元素是否在另外两个数组中的值的范围内;

54、cvInRangeS:检查一个数组的元素的值是否在另外两个标量的范围内;

55、cvInvert:求矩阵的逆;

56、cvMahalonobis:计算两个向量间的马氏距离;

57、cvMax:在两个数组中进行元素级的取最大值操作;

58、cvMaxS:在一个数组和一个标量中进行元素级的取最大值操作;

59、cvMerge:把几个单通道图像合并为一个多通道图像;

60、cvMin:在两个数组中进行元素级的取最小值操作;

61、cvMinS:在一个数组和一个标量中进行元素级的取最小值操作;

62、cvMinMaxLoc:寻找数组中的最大最小值;

63、cvMul:计算两个数组的元素级的乘积(点乘);

64、cvNot:按位对数组中的每一个元素求反;

65、cvNormalize:将数组中元素进行归一化;

66、cvOr:对两个数组进行按位或操作;

67、cvOrs:在数组与标量之间进行按位或操作;

68、cvReduce:通过给定的操作符将二维数组简为向量;

69、cvRepeat:以平铺的方式进行数组复制;

70、cvSet:用给定值初始化数组;

71、cvSetZero:将数组中所有元素初始化为0;

72、cvSetIdentity:将数组中对角线上的元素设为1,其他置0;

73、cvSolve:求出线性方程组的解;

74、cvSplit:将多通道数组分割成多个单通道数组;

75、cvSub:两个数组元素级的相减;

76、cvSubS:元素级的从数组中减去标量;

77、cvSubRS:元素级的从标量中减去数组;

78、cvSum:对数组中的所有元素求和;

79、cvSVD:二维矩阵的奇异值分解;

80、cvSVBkSb:奇异值回代计算;

81、cvTrace:计算矩阵迹;

82、cvTranspose:矩阵的转置运算;

83、cvXor:对两个数组进行按位异或操作;

84、cvXorS:在数组和标量之间进行按位异或操作;

85、cvZero:将所有数组中的元素置为0;

86、cvConvertScaleAbs:计算可选的缩放值的绝对值之后再转换数组元素的类型;

87、cvNorm:计算数组的绝对范数, 绝对差分范数或者相对差分范数;

88、cvAnd:对两个数组进行按位与操作;

89、cvAndS:在数组和标量之间进行按位与操作;  

90、cvScale:是cvConvertScale的一个宏,可以用来重新调整数组的内容,并且可以将参数从一种数据类型转换为另一种;

91、cvT:是函数cvTranspose的缩写;

92、cvLine:画直线;

93、cvRectangle:画矩形;

94、cvCircle:画圆;

95、cvEllipse:画椭圆;

96、cvEllipseBox:使用外接矩形描述椭圆;

97、cvFillPoly、cvFillConvexPoly、cvPolyLine:画多边形;

98、cvPutText:在图像上输出一些文本;

99、cvInitFont:采用一组参数配置一些用于屏幕输出的基本个特定字体;

100、cvSave:矩阵保存;

101、cvLoad:矩阵读取;

102、cvOpenFileStorage:为读/写打开存储文件;

103、cvReleaseFileStorage:释放存储的数据;

104、cvStartWriteStruct:开始写入新的数据结构;

105、cvEndWriteStruct:结束写入数据结构;

106、cvWriteInt:写入整数型;

107、cvWriteReal:写入浮点型;

108、cvWriteString:写入字符型;

109、cvWriteComment:写一个XML或YAML的注释字串;

110、cvWrite:写一个对象;

111、cvWriteRawData:写入多个数值;

112、cvWriteFileNode:将文件节点写入另一个文件存储器;

113、cvGetRootFileNode:获取存储器最顶层的节点;

114、cvGetFileNodeByName:在映图或存储器中找到相应节点;

115、cvGetHashedKey:为名称返回一个惟一的指针;

116、cvGetFileNode:在映图或文件存储器中找到节点;

117、cvGetFileNodeName:返回文件的节点名;

118、cvReadInt:读取一个无名称的整数型;

119、cvReadIntByName:读取一个有名称的整数型;

120、cvReadReal:读取一个无名称的浮点型;

121、cvReadRealByName:读取一个有名称的浮点型;

122、cvReadString:从文件节点中寻找字符串;

123、cvReadStringByName:找到一个有名称的文件节点并返回它;

124、cvRead:将对象解码并返回它的指针;

125、cvReadByName:找到对象并解码;

126、cvReadRawData:读取多个数值;

127、cvStartReadRawData:初始化文件节点序列的读取;

128、cvReadRawDataSlice:读取文件节点的内容;

129、cvGetModuleInfo:检查IPP库是否已经正常安装并且检验运行是否正常;

130、cvResizeWindow:用来调整窗口的大小;

131、cvSaveImage:保存图像;

132、cvMoveWindow:将窗口移动到其左上角为x,y的位置;

133、cvDestroyAllWindow:用来关闭所有窗口并释放窗口相关的内存空间;

134、cvGetTrackbarPos:读取滑动条的值;

135、cvSetTrackbarPos:设置滑动条的值;

136、cvGrabFrame:用于快速将视频帧读入内存;

137、cvRetrieveFrame:对读入帧做所有必须的处理;

138、cvConvertImage:用于在常用的不同图像格式之间转换;

139、cvErode:形态腐蚀;

140、cvDilate:形态学膨胀;

141、cvMorphologyEx:更通用的形态学函数;

142、cvFloodFill:漫水填充算法,用来进一步控制哪些区域将被填充颜色;

143、cvResize:放大或缩小图像;

144、cvPyrUp:图像金字塔,将现有的图像在每个维度上都放大两倍;

145、cvPyrSegmentation:利用金字塔实现图像分割;

146、cvThreshold:图像阈值化;

147、cvAcc:可以将8位整数类型图像累加为浮点图像;

148、cvAdaptiveThreshold:图像自适应阈值;

149、cvFilter2D:图像卷积;

150、cvCopyMakeBorder:将特定的图像轻微变大,然后以各种方式自动填充图像边界;

151、cvSobel:图像边缘检测,Sobel算子;

152、cvLaplace:拉普拉斯变换、图像边缘检测;

153、cvHoughLines2:霍夫直线变换;

154、cvHoughCircles:霍夫圆变换;

155、cvRemap:图像重映射,校正标定图像,图像插值;

156、cvWarpAffine:稠密仿射变换;

157、cvGetQuadrangleSubPix:仿射变换;

158、cvGetAffineTransform:仿射映射矩阵的计算;

159、cvCloneImage:将整个IplImage结构复制到新的IplImage中;

160、cv2DRotationMatrix:仿射映射矩阵的计算;

161、cvTransform:稀疏仿射变换;

162、cvWarpPerspective:密集透视变换(单应性);

163、cvGetPerspectiveTransform:计算透视映射矩阵;

164、cvPerspectiveTransform:稀疏透视变换;

165、cvCartToPolar:将数值从笛卡尔空间到极坐标(极性空间)进行映射;

166、cvPolarToCart:将数值从极性空间到笛卡尔空间进行映射;

167、cvLogPolar:对数极坐标变换;

168、cvDFT:离散傅里叶变换;

169、cvMulSpectrums:频谱乘法;

170、cvDCT:离散余弦变换;

171、cvIntegral:计算积分图像;

172、cvDistTransform:图像的距离变换;

173、cvEqualizeHist:直方图均衡化;

174、cvCreateHist:创建一新直方图;

175、cvMakeHistHeaderForArray:根据已给出的数据创建直方图;

176、cvNormalizeHist:归一化直方图;

177、cvThreshHist:直方图阈值函数;

178、cvCalcHist:从图像中自动计算直方图;

179、cvCompareHist:用于对比两个直方图的相似度;

180、cvCalcEMD2:陆地移动距离(EMD)算法;

181、cvCalcBackProject:反向投影;

182、cvCalcBackProjectPatch:图块的方向投影;

183、cvMatchTemplate:模板匹配;

184、cvCreateMemStorage:用于创建一个内存存储器;

185、cvCreateSeq:创建序列;

186、cvSeqInvert:将序列进行逆序操作;

187、cvCvtSeqToArray:复制序列的全部或部分到一个连续内存数组中;

188、cvFindContours:从二值图像中寻找轮廓;

189、cvDrawContours:绘制轮廓;

190、cvApproxPoly:使用多边形逼近一个轮廓;

191、cvContourPerimeter:轮廓长度;

192、cvContoursMoments:计算轮廓矩;

193、cvMoments:计算Hu不变矩;

194、cvMatchShapes:使用矩进行匹配;

195、cvInitLineIterator:对任意直线上的像素进行采样;

196、cvSampleLine:对直线采样;

197、cvAbsDiff:帧差;

198、cvWatershed:分水岭算法;

199、cvInpaint:修补图像;

200、cvGoodFeaturesToTrack:寻找角点;

201、cvFindCornerSubPix:用于发现亚像素精度的角点位置;

202、cvCalcOpticalFlowLK:实现非金字塔的Lucas-Kanade稠密光流算法;

203、cvMeanShift:mean-shift跟踪算法;

204、cvCamShift:camshift跟踪算法;

205、cvCreateKalman:创建Kalman滤波器;

206、cvCreateConDensation:创建condensation滤波器;

207、cvConvertPointsHomogenious:对齐次坐标进行转换;

208、cvFindChessboardCorners:定位棋盘角点;

209、cvFindHomography:计算单应性矩阵;

210、cvRodrigues2:罗德里格斯变换;

211、cvFitLine:直线拟合算法;

212、cvCalcCovarMatrix:计算协方差矩阵;

213、cvInvert:计算协方差矩阵的逆矩阵;

214、cvMahalanobis:计算Mahalanobis距离;

215、cvKMeans2:K均值;

216、cvCloneMat:根据一个已有的矩阵创建一个新矩阵;

217、cvPreCornerDetect:计算用于角点检测的特征图;

218、cvGetImage:CvMat图像数据格式转换成IplImage图像数据格式;

219、cvMatMul:两矩阵相乘;
openCV函数 - 219个

 

  • 常用API 

常用函数

cvAbs 计算数组中所有元素的绝对值 042
cvAbsDiff 计算两个数组差值的绝对值 042
cvAbsDiffs 计算数组和标量差值的绝对值 042
cvAdd 两个数组的元素级的加运算 033
cvAdds 一个数组和一个标量的元素级的相加运算 033
cvAddWeighted 两个数组的元素的加权相加运算(alpha融合) 000
cvAvg 计算数组所有元素的平均值 011
cvAvgSdv 计算数组中所有元素的绝对值和标准差 011
cvCalcCovarMatrix 计算一组n维空间向量的协方差 020
cvCmp 对两个数组中的所有元素运用设置的比较操作 002
cvCmps 对数组和标量运用设置的比较 002
cvConvertScale 用可选的缩放值转换数组元素类型 013
cvConvertScaleAbs 计算可选的缩放值的绝对值之后在转换数组元素的类型 013
cvCopy 把数组中的值复制到另一个数组中 001
cvCountNonZero 计算数组中非0值的个数 047
cvCrossProduct 计算两个三维向量的向量积(叉积) 051
cvCvtColor 将数组通道从一个颜色空间转换到另外一个颜色空间 010
cvDet 计算方阵的行列式 031
cvDiv 用另外一个数组对一个数组进行元素级的除法运算 041
cvDotProduct 计算两个向量的点积 050
cvEigenVV 计算方阵的特征值和特征向量 031
cvFlip 围绕选定翻转 012
cvGEMM 矩阵乘法 032
cvGetCol 从一个数组的列中复制元素  
cvGetCols 从数据的相邻的多列中复制元素 045
cvGetDiag 复制数组中对角线上的所有元素 045
cvGetDims 返回数组的维数 044
cvGetDimSize 返回一个数组的所有维大小  
cvGetRow 从一个数组的行中复制元素  
cvGetRows 从一个数组的多个相邻行中复制元素 045
cvGetSize 得到二维数组的尺寸,一CvSize返回 014
cvGetSubRect 从一个数组的子区域复制元素值 015
cvInRange 检查一个数组的元素是否在另外两个数组中的值范围内  
cvInRangeS 检查一个数组的元素是否在另外两个标量的范围内  
cvInvert 求矩阵的转置  
cvMahalonobis 计算两个向量间的马氏距离  
cvMax 在两个数组中进行元素级的取最大值操作 002
cvMaxS 在一个数组和一个标量中进行元素级的取最大值操作 002
cvMerge 把几个单通道图像合并为一个多通道图像 011
cvMin 在两个数组中进行元素级的取最小值操作 002
cvMinS 在一个数组和一个标量中进行元素级的取最小值操作 002
cvMinMaxLoc 寻找数组中的最大最小值 046
cvMul 计算两个数组元素级的乘积 041
cvNot 按位对数组中的每一个元素求反 043
cvNorm 计算两个数组的正态相关性  
cvNormalize 将数组中的元素归一化  
cvOr 对两个数组元素按位或操作 043
cvOrs 对数组与标量之间进行按位或操作  
cvReduce 通过给定的操作符将二维数组约简为向量  
cvRepeat 以平铺的方式进行数组复制 001
cvSet 用给定值初始化数组 040
cvSetZero 将数组中的所有元素初始为0 040
cvSetIdentity 将数组中对角线上的元素设为1,其他为0  
cvSolve 求出线性方程的解  
cvSplit 将多通道数组分割成但通道数组 011
cvSub 两个数组元素级的相减 033
cvSubS 元素级的从数组减去标量  
cvSubRS 元素级的从标量减去数组  
cvSum 对数组中的所有元素求和 011
cvSVD 二维矩阵的奇异值分解  
cvSVBkSb 奇异值回代计算  
cvTrace 计算矩阵迹  
cvTranspose 矩阵的转置运算  
cvXor 对两个数组进行按位异或运算 043
cvXorS 在数组和标量之间进行安慰异或操作  
cvZero 将所有数组中的元素置为0 040

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 000. 两张图像融合
#include <highgui.h>
#include <stdio.h>

// alphablend <imageA> <image B> <x> <y> <width> <height>
//            <alpha> <beta>

int main(void)
{
    char *argvv[10];
    argvv[1] = "/home/unsw/lolo.jpg";
    argvv[2] = "/home/unsw/lolo2.jpg";
    argvv[3] = "0";
    argvv[4] = "0";
    argvv[5] = "500";
    argvv[6] = "1000";
    argvv[7] = "0";
    argvv[8] = "0.1";

    IplImage *src1, *src2;
    if( ((src1=cvLoadImage(argvv[1],1)) != 0) &&
            ((src2=cvLoadImage(argvv[2],1)) != 0 ))
    {
        int x = atoi(argvv[3]);
        int y = atoi(argvv[4]);
        int width = atoi(argvv[5]);
        int height = atoi(argvv[6]);
        double alpha = (double)atof(argvv[7]);
        double beta  = (double)atof(argvv[8]);

        cvSetImageROI(src1, cvRect(x,y,width,height));
        cvSetImageROI(src2, cvRect(0,0,width,height));

        // 图片混合显示
        cvAddWeighted(src1, alpha, src2, beta, 0.0, src1);

        cvResetImageROI(src1);
        cvNamedWindow( "Alpha_blend", 1 );
        cvShowImage( "Alpha_blend", src1 );
        cvWaitKey(5000);
    }
    else
        printf("Couldn't load one or both of %s, %s\n",argvv[1],argvv[2]);
    return 0;
}
cvAddWeighted

 

  • 001. 图片拷贝
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage *src1, *src2,*src3;  
    src1=cvLoadImage("5.jpg");  
    src2=cvLoadImage("3.jpg");  // 作为mask
    src3=cvLoadImage("7.jpg");  
  
  
    cvCopy(src1,src3,src2);  

    cvShowImage( "测试1", src1);  
    cvShowImage( "测试2", src2);  
    cvShowImage( "测试3", src3);  
    cvWaitKey();  
    return 0;  
}  
cvCopy

下面的没有去点开关

#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
   
int main()   
{   
    IplImage *src1, *src2,*src3;  
    src1 = cvLoadImage("1.jpg");  
    src2 = cvLoadImage("7.jpg");  
  
    cvRepeat(src1,src2);  
  
    cvShowImage( "测试1", src1);  
    cvShowImage( "测试2", src2);  
    cvWaitKey();  
    return 0;  
} 
cvRepeat

 

  • 002. 图片比较
CV_CMP_EQ    (src1i == src2i)
CV_CMP_GT    (src1i > src2i)
CV_CMP_GE    (src1i >= src2i)
CV_CMP_LT    (src1i < src2i)
CV_CMP_LE    (src1i <= src2i)
CV_CMP_NE    (src1i != src2i)
比较方式:cmp_op
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage *src1, *src2,*src3;  
    src1=cvLoadImage("5.jpg");  
    src2=cvLoadImage("6.jpg");  
    src3=cvLoadImage("5.jpg");  
  
  
    cvCmp(src1,src2,src3,CV_CMP_GE);  

    cvShowImage( "测试1", src1);  
    cvShowImage( "测试2", src2);  
    cvShowImage( "测试3", src3);  
    cvWaitKey();  
    return 0;  
}  
cvCmp
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage *src1,*src2;  
    src1=cvLoadImage("5.jpg");  
    src2=cvLoadImage("5.jpg");  
  
  
    cvCmpS(src1,250.2,src2,CV_CMP_GE);  

    cvShowImage( "测试1", src1);  
    cvShowImage( "测试2", src2);  
    cvWaitKey();  
    return 0;  
}
cvCmpS  

 

#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage *src1, *src2,*src3;  
    src1 = cvLoadImage("7.jpg");  
    src2 = cvLoadImage("1.jpg");  
    src3 = cvLoadImage("3.jpg");  
  
    cvMax(src2,src3,src1);  
  
    cvShowImage( "测试1", src1);  
    cvShowImage( "测试2", src2);  
    cvShowImage( "测试3", src3);  
    cvWaitKey();  
    return 0;  
}  
cvMax
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage *src1, *src2,*src3;  
    src1 = cvLoadImage("7.jpg");  
    src2 = cvLoadImage("1.jpg");  
  
    cvMaxS(src2,200,src1);  
  
    cvShowImage( "测试1", src1);  
    cvShowImage( "测试2", src2);  
    cvWaitKey();  
    return 0;  
}  
cvMaxS
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage *src1, *src2,*src3;  
    src1 = cvLoadImage("7.jpg");  
    src2 = cvLoadImage("1.jpg");  
    src3 = cvLoadImage("3.jpg");  
  
    cvMin(src2,src3,src1);  
  
    cvShowImage( "测试1", src1);  
    cvShowImage( "测试2", src2);  
    cvShowImage( "测试3", src3);  
    cvWaitKey();  
    return 0;  
}  
cvMin
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage *src1, *src2,*src3;  
    src1 = cvLoadImage("7.jpg");  
    src2 = cvLoadImage("1.jpg");  
  
    cvMinS(src2,200,src1);  
  
    cvShowImage( "测试1", src1);  
    cvShowImage( "测试2", src2);  
    cvWaitKey();  
    return 0;  
}  
cvMinS

  

  • 010. 色彩空间调整
#include <cv.h>
#include <highgui.h>
#include <stdio.h>

int main(int argc, char** argv)
{
    IplImage  *src2,*src3;
    src2=cvLoadImage("/home/unsw/lolo.jpg");
    src3=cvLoadImage("/home/unsw/lolo.jpg");


    cvCvtColor(src2,src3,CV_RGB2HSV);
    cvShowImage( "测试2", src2);
    cvShowImage( "测试3", src3);
    cvWaitKey();
    return 0;
}
View Code
CV_BGR2RGB
CV_RGB2BGR
CV_RGBA2BGRA
CV_BGRA2RGBA         在RGB或BGR色彩空间之间转换(包括或者不包括alpha 通道) 
CV_RGB2RGBA
CV_BGR2BGRA           在RGB或BGR图像中加入alpha 通道
CV_RGBA2RGB
CV_BGRA2BGR           从RGB或BGR图像中删除alpha 通道
CV_RGB2BGRA
CV_RGBA2BGR
CV_BGRA2RGB
CV_BGR2RGBA            加入或者移除alpha通道时,转换RGB到BGR 色彩空间
CV_RGB2GRAY
CV_BGR2GRAY            转换RGB或者BGR色彩空间为灰度空间 
CV_GRAY2RGB
CV_GRAY2BGR
CV_RGBA2GRAY
CV_BGRA2GRAY         转换灰度为RGB或者BGR色彩空间(在进程中选择移除alpha通道) 
CV_GRAY2RGBA
CV_GRAY2BGRA         转换灰度为RGB或者BGR色彩空间并且加入alpha通道
CV_RGB2BGR565
CV_BGR2BGR565
CV_BGR5652RGB
CV_BGR5652BGR
CV_RGBA2BGR565
CV_BGRA2BGR565
CV_BGR5652RGBA
CV_BGR5652BGRA        在从RGB或者BGR色彩空间转换到BGR565彩色图画时,选择加入或者移除 alpha通道 (16位图) 
CV_GRAY2BGR565
CV_BGR5652GRAY         转换灰度为BGR565彩色图像或者反变换(16位图) 
CV_RGB2BGR555
CV_BGR2BGR555
CV_BGR5552RGB
CV_BGR5552BGR
CV_RGBA2BGR555
CV_BGRA2BGR555          在从RGB或者BGR色彩空间转换到BGR555色彩空间时,选择加入或者移除alpha通道(16位图)
CV_BGR5552RGBA
CV_BGR5552BGRA 
CV_GRAY2BGR555
CV_BGR5552GRAY          转换灰度到BGR555色彩空间或者反变换(16位图)
CV_RGB2XYZ
CV_BGR2XYZ
CV_XYZ2RGB
CV_XYZ2BGR                    转换RGB或者BGR色彩空间到CIE XYZ色彩空间或者反变换(Rec 709和D65 白点)
CV_RGB2YCrCb 
CV_BGR2YCrCb 
CV_YCrCb2RGB 
CV_YCrCb2BGR                转换RGB 或者BGR色彩空间到luma-chroma (aka YCC)色彩空间
CV_RGB2HSV 
CV_BGR2HSV 
CV_HSV2RGB 
CV_HSV2BGR                    转换RGB或者BGR色彩空间到HSV(hue,saturation,value)色彩空间或反变换
CV_RGB2HLS 
CV_BGR2HLS 
CV_HLS2RGB 
CV_HLS2BGR                     转换RGB或者BGR色彩空间到HLS(hue,Lightness,saturation)色彩空间或反变换
CV_RGB2Lab 
CV_BGR2Lab 
CV_Lab2RGB 
CV_Lab2BGR                      转换RGB或者BGR色彩空间到CIE LAB色彩空间或反变换
CV_RGB2Luv 
CV_BGR2Luv 
CV_Luv2RGB 
CV_Luv2BGR                        转换RGB或者BGR色彩空间到CIE Luv色彩空间
CV_BayerBG2RGB 
CV_BayerGB2RGB               转换Bayer模式(单通道) 到RGB或者BGR色彩空间
CV_BayerRG2RGB 
CV_BayerGR2RGB 
CV_BayerBG2BGR 
CV_BayerGB2BGR 
CV_BayerRG2BGR 
CV_BayerGR2BGR
色彩空间宏

 

  • 011. 多通道 分解 or 合并 or 总和 or 均值、标准差
View Code
#include<cv.h>
#include<cxcore.h>
#include<highgui.h>

using namespace std;

int main(int argc,char **argv)
{
    //if(argc>=2)
    {
        IplImage *image,*change,*H,*S,*V,*R,*B,*G,*two,*Zero;
        //创建图像显示窗口
        cvNamedWindow("image",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("R",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("G",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("B",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("HS",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("HV",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("VS",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("RG",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("RB",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("BG",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("Zero",CV_WINDOW_AUTOSIZE);

        image=cvLoadImage("/home/unsw/lolo.jpg);//载入图像

        //分配图像空间
        change=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,3);
        R=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
        G=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
        B=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
        H=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
        S=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
        V=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
        two=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,3);
        Zero=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);

        cvZero(Zero);//在将两个通道合并是,不能没有第三个通道,而是将该通道设为空白,即全0

        cout<<"IPL_DEPTH_8U = "<<IPL_DEPTH_8U<<endl;
        cout<<"CV_RGB2HSV = "<<CV_RGB2HSV<<endl;
        cout<<"CV_HSV2RGB = "<<CV_HSV2RGB<<endl;

        cvCvtColor(image,change,CV_RGB2HSV);  //将RGB色系转换为HSV色系
        
        cvSplit(image,R,G,B,0);//分离多通道
        cvSplit(change,H,S,V,0);//分离多通道

        //显示RGB图单通道图
        cvShowImage("image",image);
        cvShowImage("Zero",Zero);
        cvShowImage("R",R);
        cvShowImage("G",G);
        cvShowImage("B",B);


        cvMerge(R,G,Zero,0,two);   //合并两个图像空间
        cvShowImage("RG",two);//显示B通道为空白时的图像

        cvMerge(Zero,G,B,0,two);
        cvShowImage("BG",two);
    
        cvMerge(R,Zero,B,0,two);
        cvShowImage("RB",two);

        cvMerge(H,S,Zero,0,two);
        cvCvtColor(two,change,CV_HSV2RGB);//cvShowImage是按照RGB色彩方式显示图像的,故要通过RGB色系展示对HSV色系的更改效果
        cvShowImage("HS",change);

        cvMerge(Zero,S,V,0,two);
        cvCvtColor(two,change,CV_HSV2RGB);//cvShowImage是按照RGB色彩方式显示图像的,故要通过RGB色系展示对HSV色系的更改效果
        cvShowImage("VS",change);

        cvMerge(H,Zero,V,0,two);
        cvCvtColor(two,change,CV_HSV2RGB);//cvShowImage是按照RGB色彩方式显示图像的,故要通过RGB色系展示对HSV色系的更改效果
        cvShowImage("HV",change);

        cvWaitKey(0);

        cvDestroyAllWindows();
        cvReleaseImage(&image);
        cvReleaseImage(&change);
    }
    system("pause");
    return 1;
}
多通道分解实例

 

void cvMerge(//cvSplit()的逆运算  
    const CvArr* src0,//图1  
    const CvArr* src1,//图2  
    const CvArr* src2,//图3  
    const CvArr* src3,//图4  
    CvArr* dst//结果图  
);  
cvMerge
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage *src1,*src2,*dst11,*dst12,*dst13;  
  
    src1=cvLoadImage("5.jpg");  
    src2=cvLoadImage("7.jpg");  
  
    dst11 = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);  
    dst12 = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);  
    dst13 = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);  
  
    cvSplit(src1, dst11, dst12, dst13, 0);//分解  
    cvMerge(dst11,dst12,dst13,NULL,src2);  //再合并
  
    cvShowImage( "测试", src2);  
  
    cvWaitKey();  
    return 0;  
}  
多通道合并实例

 

#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
int main()   
{   
    IplImage *src1,*dst1,*dst2,*dst3,*dst4;  
    src1=cvLoadImage("3.jpg",1);  
      
    CvScalar cs = cvSum(src1);  
  
    cout << "通道一总和:";  
    cout << cs.val[0] << endl;  
    cout << "通道二总和:";  
    cout << cs.val[1] << endl;  
    cout << "通道三总和:";  
    cout << cs.val[2] << endl;  
    cout << "通道四总和:";  
    cout << cs.val[3] << endl;  
  
    getchar();  
    return 0;  
}
cvSum

 

#include <cv.h>  
#include <highgui.h>  
#include <iostream>  
#include <stdio.h>  
using namespace std;  
  
int main(int argc, char** argv)  
{  
    IplImage *src1;  
    src1=cvLoadImage("1.jpg");  
  
    CvScalar cs;  
      
    cs = cvAvg(src1);  
  
    cout<<cs.val[0] << endl;  
    cout<<cs.val[1] << endl;  
    cout<<cs.val[2] << endl;  
    cout<<cs.val[3] << endl;  
  
    getchar();  
    return 0;  
}  
cvAvg
#include <cv.h>  
#include <highgui.h>  
#include <iostream>  
#include <stdio.h>  
using namespace std;  
  
int main(int argc, char** argv)  
{  
    IplImage *src1;  
    src1=cvLoadImage("1.jpg");  
  
    CvScalar cs,cs1;  
      
    cvAvgSdv(src1,&cs,&cs1);   // <-- 多了标准差
  
    cout<<"平均值:"<<endl;  
    cout<<cs.val[0] << endl;  
    cout<<cs.val[1] << endl;  
    cout<<cs.val[2] << endl;  
    cout<<cs.val[3] << endl;  
    cout <<endl;  

    cout <<"标准差"<<endl;  
    cout<<cs1.val[0] << endl;  
    cout<<cs1.val[1] << endl;  
    cout<<cs1.val[2] << endl;  
    cout<<cs1.val[3] << endl;  
  
    getchar();  
    return 0;  
}  
cvAvgSdv附送标准差

 

  • 012. 轴翻转
View Code
View Code

  

  • 013. 像素线性变换
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage  *src2,*src3;  
    src2=cvLoadImage("3.jpg");  
    src3=cvLoadImage("7.jpg");  
  
  
    cvConvertScale(src2,src3,4.0,-220.0);  

    cvShowImage( "测试2", src2);  
    cvShowImage( "测试3", src3);  
    getchar();  
    return 0;  
} 
cvConvertScale
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage  *src2,*src3;  
    src2=cvLoadImage("3.jpg");  
    src3=cvLoadImage("7.jpg");  
  
    cvConvertScaleAbs(src2,src3,4.0,-220.5);  
  
    cvShowImage( "测试2", src2);  
    cvShowImage( "测试3", src3);  
    cvWaitKey();  
    return 0;  
} 
cvConvertScaleAbs

cvScale是cvConvertScale的一个宏,可以用来重新调整数组的内容,并且可以将参数从一种数据类型转换为另一种;

#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
int main()   
{   
    IplImage* src1 = cvLoadImage("1.jpg",CV_LOAD_IMAGE_GRAYSCALE);    
  
    IplImage* src2 = cvCloneImage(src1);    
  
    IplImage* dst = cvCreateImage(cvGetSize(src1),IPL_DEPTH_64F,src1->nChannels);    
  
    double max_Val,min_Val;    
    cvScale(src1,dst,1.0,0.0);    
    cvAdd(dst,dst,dst);    
  
    cvMinMaxLoc(dst, &min_Val, &max_Val, NULL, NULL, NULL);    // <--
  
    cvScale(dst,src2,1.0,0.0);    
  
    cvScale(dst, dst, 1.0/(max_Val-min_Val), 1.0*(-min_Val)/(max_Val-min_Val));   // <--
  
    cvMinMaxLoc(dst, &min_Val, &max_Val, NULL, NULL, NULL);    
  
    cvShowImage("测试1",src1);    
  
    cvShowImage("测试2",src2);    
  
    cvShowImage("结果",dst);    
  
    cvWaitKey(-1);    
    return 0;  
}  
cvScale

 

  • 014. 图像尺寸
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
  
int main()   
{   
    IplImage *src1;  
    src1=cvLoadImage("5.jpg");  

    CvSize cs = cvGetSize(src1);  

    cout << "图像的尺寸为:(单位:像素)"<<endl;  
    cout <<"高:"<< cs.height << endl;  
    cout <<"宽:"<<cs.width << endl;  

    getchar();  
    return 0;  
}  
cvGetSize

 

  • 015. 截取图像区域 
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
int main()   
{   
    IplImage *res;  
    int subX = 0;  
    int subY = 0;  
  
    CvMat matSrc;  
  
    res = cvLoadImage("1.jpg", CV_LOAD_IMAGE_COLOR);  
  
    subX = res->width / 2;  
    subY = res->height / 2;  
  
    CvMat *pMat = cvGetSubRect(res, &matSrc, cvRect(0, 0, res->width - subX, res->height - subY));  
  
    IplImage *pSubImg = cvCreateImageHeader(cvSize(440, 660), 8, 1);  
    cvGetImage(pMat, pSubImg);   
  
    cvShowImage("所截图像",pSubImg);  
    cvShowImage("原图像", res);  
    cvWaitKey(0);  
    return 0;  
}  
cvGetSubRect

 

  • 016. 像素设值 
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main()   
{   
    IplImage *src1, *src2;  
    src1 = cvLoadImage("1.jpg");  
    src2 = cvLoadImage("1.jpg");  
  
    CvScalar cs;  
    cs.val[0] = 0;  
    cs.val[1] = 0;  
    cs.val[2] = 255;  
    cs.val[3] = 0;  
      
    cvSet(src1,cs);  
  
    cvShowImage( "结果图", src1);  
    cvShowImage( "原图", src2);  
    cvWaitKey();  
    return 0;  
}  
cvSet
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main()   
{   
    IplImage *src1, *src2;  
    src1 = cvLoadImage("1.jpg");  
    src2 = cvLoadImage("1.jpg");  
  
    CvScalar cs;  
    cs.val[0] = 0;  
    cs.val[1] = 0;  
    cs.val[2] = 255;  
    cs.val[3] = 0;  
      
    cvSetZero(src1);  
  
    cvShowImage( "结果图", src1);  
    cvShowImage( "原图", src2);  
    cvWaitKey();  
    return 0;  
}  
cvSetZero

 

  • 020 协方差矩阵

  • 协方差矩阵很简单,可它却是很多领域里的非常有力的工具。它能导出一个变换矩阵,这个矩阵能使数据完全去相关(decorrelation)。从不同的角度来看,也就是说能够找出一组最佳的基以紧凑的方式来表达数据。(完整的证明请参考瑞利商)。
  • 这个方法在统计学中被称为主成分分析(principal components analysis),在图像处理中称为Karhunen-Loève 变换(KL-变换)。
CV_IMPL void 
cvCalcCovarMatrix( const CvArr** vecarr, int count,
                   CvArr* covarr, CvArr* avgarr, int flags )
{
    cv::Mat cov0 = cv::cvarrToMat(covarr), cov = cov0, mean0, mean;
    CV_Assert( vecarr != 0 && count >= 1 ); 

    if( avgarr )
        mean = mean0 = cv::cvarrToMat(avgarr);

    if( (flags & CV_COVAR_COLS) != 0 || (flags & CV_COVAR_ROWS) != 0 )
    {    

        cv::Mat data = cv::cvarrToMat(vecarr[0]);
        cv::calcCovarMatrix( data, cov, mean, flags, cov.type() );
    }    
    else 
    {    
        std::vector<cv::Mat> data(count);
        for( int i = 0; i < count; i++ )
            data[i] = cv::cvarrToMat(vecarr[i]);
        cv::calcCovarMatrix( &data[0], count, cov, mean, flags, cov.type() );
    }    

    if( mean.data != mean0.data && mean0.data )
        mean.convertTo(mean0, mean0.type());

    if( cov.data != cov0.data )
        cov.convertTo(cov0, cov0.type());
}
"modules/core/src/matmul.cpp"

  

该函数的使用 1: 

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <iostream>

using namespace cv;
using namespace std;

int main(int /*argc*/, char** /*argv*/)
{
    Mat_<float> samples = (Mat_<float>(3, 3) << 1.0, 2.0, 3.0,
                                                4.0, 5.0, 6.0,
                                                7.0, 8.0, 9.0);

    Mat cov, mu;
    cv::calcCovarMatrix(samples, cov, mu, CV_COVAR_NORMAL | CV_COVAR_ROWS);

    cout << "cov: " << endl;
    cout << cov << endl;

    cout << "mu: " << endl;
    cout << mu << endl;

    return 0;
}
View Code

运行结果:

cov: 
 [18, 18, 18;
  18, 18, 18;
  18, 18, 18]
mu: 
  [4,  5,  6]
View Code

 

该函数的使用 2:

#include <iostream>
#include <fstream>
#include <cv.h>
#include <highgui.h>
 
using namespace std;
using namespace cv; 
 
// OpenCV Covariance Example
// Chye Connsynn and Carson Reynolds March 23, 2011
// An example that computes a covariance matrix
// Tested using OpenCV 2.2 on OS X 10.6.7
 
int main( int argc, char** argv ) {
  // Input matrix size
  const int rows = 2;
  const int cols = 3;  
 
  // Input matrix
  float x[rows][cols] = {{38, 55, 49},
             {43, 54, 4}};
 
  // Place input into CvMat**
  CvMat** input = new CvMat*[rows];     
  for(int i=0; i<rows; i++) {
    input[i] = cvCreateMat(1, cols, CV_32FC1);
    for(int j=0; j<cols; j++) {
      cvmSet(input[i], 0, j, x[i][j]);
    }
  }
 
  // Covariance matrix is N x N,
  // where N is input matrix column size
  const int n = cols;
 
  // Output variables passed by reference
  CvMat* output = cvCreateMat(n, n, CV_32FC1);
  CvMat* meanvec = cvCreateMat(1, rows, CV_32FC1);
 
  // Calculate covariance matrix
  cvCalcCovarMatrix((const void **) input, \
            rows, output, meanvec, CV_COVAR_NORMAL);
 
  //Show result
  cout << "Covariance matrix:" << endl;
  for(int i=0; i<n; i++) {
    for(int j=0; j<n; j++) {
      cout << "(" << i << "," << j << "): ";
      // normalize by n - 1 so that results are the same 
      // as MATLAB's cov() and Mathematica's Covariance[]
      printf ("%f ", cvGetReal2D(output,i,j) / (rows - 1));
      cout << "\t";
    }
    cout << endl;      
  }
  return(0);
}
View Code

运行结果:

Covariance matrix:
(0,0): 12.500000     (0,1): -2.500000     (0,2): -112.500000     
(1,0): -2.500000     (1,1): 0.500000     (1,2): 22.500000     
(2,0): -112.500000     (2,1): 22.500000     (2,2): 1012.500000
View Code

  

  • 021. 转置矩阵
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
int main()   
{   
    double a[5][5] =   
    {      
        {7,2,4,5,6},  
        {3,4,5,8,2},  
        {1,0,9,7,5},  
        {0,5,3,2,1},  
        {4,6,7,3,1}  
    };  
  
    CvMat va = cvMat(5,5, CV_64FC1,a);  
  
    double b[5][5] = {0};  
      
    CvMat vb = cvMat(5,5, CV_64FC1,b);  
  
    cout<<"目标矩阵:"<<endl;  
  
    for(int i=0;i<5;i++)  
    {  
        for(int j=0;j<5;j++)  
            printf("%f\t",cvmGet(&va,i,j));  
        cout << endl;  
    }  
  
    cvTranspose(&va,&vb);  
  
    cout<<"结果矩阵:"<<endl;  
  
    for(int i=0;i<5;i++)  
    {  
        for(int j=0;j<5;j++)  
            printf("%f\t",cvmGet(&vb,i,j));  
        cout << endl;  
    }  
  
    getchar();  
    return 0;  
  
}  
cvTranspose

 

cvNorm函数

cvNormalize函数 

cvReduce函数

 

 

  • 030. 计算矩阵的 行列式
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <iostream>
using namespace std;


int main() 
{ 
    double va[] = {1,0,0,0,2,0,0,0,3};  
    CvMat Va=cvMat(3, 3, CV_64FC1, va);  
    cout << "该矩阵的行列式的值为"<<cvDet(&Va) << endl;
    getchar();
    return 0;
}
View Code

适用于小型矩阵。

 

  • 031. 矩阵的 特征值特征向量
View Code
View Code

 

  • 032. 矩阵 乘法
double cvGEMM(//矩阵的广义乘法运算  
    const CvArr* src1,//乘数矩阵  
    const CvArr* src2,//乘数矩阵  
    double alpha,//1号矩阵系数  
    const CvArr* src3,//加权矩阵  
    double beta,//2号矩阵系数  
    CvArr* dst,//结果矩阵  
    int tABC = 0//变换标记  
); 
cvGEMM定义
CV_GEMM_A_T 转置 src1
CV_GEMM_B_T 转置 src2
CV_GEMM_C_T 转置 src3

 

 

 

 

函数对应的乘法运算公式为:

dst = (alpha * src1) x src2 + (beta * src3)
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
int main()   
{   
    double a[3][3] =   
    {      
        {1,0,0},  
        {0,2,0},  
        {0,0,3}  
    };  
  
    CvMat va=cvMat(3,3, CV_64FC1,a);  
  
    cout<<"目标矩阵1:"<<endl;  
  
    for(int i=0;i<3;i++)  
    {  
        for(int j=0;j<3;j++)  
            printf("%f\t",cvmGet(&va,i,j));  
        cout << endl;  
    }  
  
    double b[3][3] =   
    {      
        {1,1,1},  
        {1,1,1},  
        {1,1,1}  
    };  
  
    CvMat vb =cvMat(3, 3, CV_64FC1, b);  
  
    cout<<"目标矩阵2:"<<endl;  
    for(int i=0;i<3;i++)  
    {  
        for(int j=0;j<3;j++)  
            printf("%f\t",cvmGet(&vb,i,j));  
        cout << endl;  
    }  
  
    double c[3][3] = {0,0,0,0,0,0,0,0,0};  
    CvMat vc = cvMat(3,3, CV_64FC1, c);   
  
    cvGEMM(&va,&vb,1,&vc,1,&vc);  
  
    cout << "结果矩阵:"<< endl;  
    for(int i=0;i<3;i++)  
    {  
        for(int j=0;j<3;j++)  
        printf("%f\t",cvmGet(&vc,i,j));  
        cout << endl;  
    }  
    getchar();  
    return 0;  
} 
cvGEMM

 

  • 033. 矩阵 加减法 
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage *src1, *src2,*src3;  
    src1=cvLoadImage("1.jpg");  
    src2=cvLoadImage("3.jpg");  
    src3=cvLoadImage("4.jpg");  

    cvAdd(src1,src2,src2);  

    cvShowImage( "测试1", src1);  
    cvShowImage( "测试2", src2);  
    cvShowImage( "测试3", src3);  
    cvWaitKey();  
    return 0;  
}  
cvAdd 
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main()   
{   
    IplImage *src1,*src2,*src3;  
  
    src1 = cvLoadImage("3.jpg");  
    src2 = cvLoadImage("1.jpg");  
    src3 = cvLoadImage("7.jpg");  
  
    cvSub(src1,src2,src3);  
  
    cvShowImage("1",src1);  
    cvShowImage("2",src2);  
    cvShowImage("3",src3);  
  
    cvWaitKey();  
    return 0;  
}  
cvSub

 

  • 040. 矩阵各元素 初始化
cvZero相当于“与0”
cvSetZero
cvSet 有mask

 

  • 041. 矩阵各元素 相除 or 相乘

"modules/core/include/opencv2/core/types_c.h"

/* CvArr* is used to pass arbitrary
 * array-like data structures 
 * into functions where the particular
 * array type is recognized at runtime:
 */
typedef void CvArr;
CvArr
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
  
int main()   
{   
    double va[] = {2,4,6,8,10,12,14,16,18};    
    CvMat Va=cvMat(3, 3, CV_64FC1, va);    
    double vb[] = {1,2,3,4,5,6,7,8,9};    
    CvMat Vb=cvMat(3, 3, CV_64FC1, vb);   
  
    cout<< "矩阵A:"<<endl;  
    for(int i = 0 ;i < 3 ; i++)  
    {  
        for(int j = 0; j < 3; j++)  
            cout << CV_MAT_ELEM(Va,double,i,j)<<"  ";  
        cout << endl;  
    }  
  
    cout<< "矩阵B:"<<endl;  
    for(int i = 0 ;i < 3 ; i++)  
    {  
        for(int j = 0; j < 3; j++)  
            cout << CV_MAT_ELEM(Vb,double,i,j)<<" ";  
        cout << endl;  
    }  
  
    cvDiv(&Va,&Vb,&Va,);  
  
    cout<< "运算后的矩阵:"<<endl;  
    for(int i = 0 ;i < 3 ; i++)  
    {  
        for(int j = 0; j < 3; j++)  
            cout << CV_MAT_ELEM(Va,double,i,j)<<" ";  
        cout << endl;  
    }  
  
    getchar();  
    return 0;  
}  
cvDiv

 

void cvMul(//两个矩阵对应元素相乘  
    const CvArr* src1,//矩阵1  
    const CvArr* src2,//矩阵2  
    CvArr* dst,//结果矩阵  
    double scale = 1//因子系数  
);  
cvMul
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
int main()   
{   
    double a[3][3] =   
    {      
        {1,2,3},  
        {4,5,6},  
        {7,8,9}  
    };  
  
    CvMat va = cvMat(3,3, CV_64FC1,a);  
  
    double b[3][3] =   
    {      
        {2,1,2},  
        {1,2,1},  
        {2,1,2}  
    };  
  
    CvMat vb = cvMat(3,3, CV_64FC1,b);  
  
    cout<<"目标矩阵:"<<endl;  
  
    for(int i=0;i<3;i++)  
    {  
        for(int j=0;j<3;j++)  
            printf("%f\t",cvmGet(&va,i,j));  
        cout << endl;  
    }  
  
    cout<<"因子矩阵:"<<endl;  
  
    for(int i=0;i<3;i++)  
    {  
        for(int j=0;j<3;j++)  
            printf("%f\t",cvmGet(&vb,i,j));  
        cout << endl;  
    }  
  
    cvMul(&va,&vb,&va);  
  
    cout<<"结果矩阵:"<<endl;  
  
    for(int i=0;i<3;i++)  
    {  
        for(int j=0;j<3;j++)  
            printf("%f\t",cvmGet(&va,i,j));  
        cout << endl;  
    }  
  
    getchar();  
    return 0;  
  
}  
cvMul

 

  • 042. 矩阵各元素 绝对值
void cvAbs(  //取src中元素的绝对值,写到dst中  
  const CvArr* src,  
  const dst  
);  
  
void cvAbsDiff( //src1减去src2的差的绝对值存入dst  
  const CvArr* src1,  
  const CvArr* src2,  
  const dst  
);  
  
void cvAbsDiffs( //src中每个元素减去value存入dst中  
  const CvArr* src,  
  CvScalar value,  
  const dst  
);  
cvAbs, cvAbsDiff, cvAbsDiffs函数定义
#include <cv.h>  
#include <highgui.h>  
#include <cxcore.h>  
#include <iostream>  
using namespace std;  

int main( int argc, char** argv ){  
    CvMat *mat;  
    mat=cvCreateMat(4,4,CV_32FC1);  
  
    float value = 0.0;  
    int i = 0, j = 0;  
    cout<<"初始化原始数组"<<endl;  
    for ( i = 0; i < 4; i ++ ){  
        for( j = 0; j < 4; j ++ ){  
  
            value -= 1.0;   // 赋值 -1 --> -16
            CV_MAT_ELEM( *mat, float, i, j) = value;          
        }  
    }  
    for ( i = 0; i < 4; i ++ ){  
        for( j = 0; j < 4; j ++ ){  
  
            cout<<"\t"<<CV_MAT_ELEM( *mat, float, i, j);          
        }  
        cout<<endl;  
    }  
    CvMat *matDes;  
  
    matDes=cvCreateMat(4,4,CV_32FC1);   
  
    cout<<"目标矩阵"<<endl;  
    for ( i = 0; i < 4; i ++ ){  
        for( j = 0; j < 4; j ++ ){  
            cvmSet( matDes, i, j,0);  
            cout<<"\t"<<CV_MAT_ELEM( *matDes, float, i, j);       
        }  
  
        cout<<endl;  
    }  
  
    cvAbs( mat, matDes );  
    cout<<"数组的绝对值"<<endl;  
    for ( i = 0; i < 4; i ++ ){  
        for( j = 0; j < 4; j ++ ){  
  
            cout<<"\t"<<CV_MAT_ELEM( *matDes, float, i, j);       
        }  
  
        cout<<endl;  
    }  
  
    CvMat *matDiff1 = cvCreateMat(4,4,CV_32FC1);  
  
    cvAbsDiff( mat,matDes , matDiff1);  
    cout<<"两个差的绝对值"<<endl;  
    for ( i = 0; i < 4; i ++ ){  
        for( j = 0; j < 4; j ++ ){  
  
            cout<<"\t"<<CV_MAT_ELEM( *matDiff1, float, i, j);         
        }  
  
        cout<<endl;  
    }  
  
    CvScalar cs;  
    cs.val[0] = 2.0;  
    cs.val[1] = 1.0;  
  
    cvAbsDiffS( mat, matDiff1,cs);  
    cout<<"矩阵减去标准值的绝对值"<<endl;  
    for ( i = 0; i < 4; i ++ ){  
        for( j = 0; j < 4; j ++ ){  
  
            cout<<"\t"<<CV_MAT_ELEM( *matDiff1, float, i, j);         
        }  
  
        cout<<endl;  
    }  
    cvReleaseMat( &mat );  
    cvReleaseMat( &matDes );  
    getchar();  
    return 0;  
}  
View Code

 

  • 043. 矩阵中各元素 逻辑运算
cvNot
cvOr
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
  
int main(int argc, char** argv)  
{  
    IplImage *src1, *src2,*src3;  
    src1=cvLoadImage("1.jpg");  
    src2=cvLoadImage("3.jpg");  
    src3=cvLoadImage("4.jpg");  
  
    cvAnd(src1,src2,src3);  

    cvShowImage( "测试1", src1);  
    cvShowImage( "测试2", src2);  
    cvShowImage( "测试3", src3);  
    cvWaitKey();  
    return 0;  
}  
cvAnd
cvXor

 

  • 044. 矩阵的维度和大小
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <iostream>
using namespace std;

int main() 
{ 
    double a[5][5] = 
    {    
        {1,0,0,0,6},
        {0,2,0,7,0},
        {0,0,3,0,0},
        {0,9,0,4,0},
        {8,0,0,0,5}
    };

    CvMat va=cvMat(5,5, CV_64FC1,a);

    cout<<"目标矩阵:"<<endl;

    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
            printf("%f\t",cvmGet(&va,i,j));
        cout << endl;
    }

    int sizes[100] = {0};

    int v = cvGetDims(&va,sizes);
    cout << "矩阵的维数:";
        cout << v << endl;
    cout << "每个维度上的大小:"<<endl;
    for(int i = 0 ; i<100&&sizes[i]!=0;i++)
    cout << sizes[i] << endl;
    getchar();
    return 0;
}
cvGetDims

 

  • 045. 矩阵的 某行 or 某列 or 对角线
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
  
int main()   
{   
    double a[5][5] =   
    {      
        {1,0,0,0,0},  
        {0,2,0,0,0},  
        {0,0,3,0,0},  
        {0,0,0,4,0},  
        {0,0,0,0,5}  
    };  
  
    CvMat va=cvMat(5,5, CV_64FC1,a);  
  
    cout<<"目标矩阵:"<<endl;  
  
    for(int i=0;i<5;i++)  
    {  
        for(int j=0;j<5;j++)  
            printf("%f\t",cvmGet(&va,i,j));  
        cout << endl;  
    }  
  
    CvMat vb =cvMat(5,5, CV_64FC1);  
    CvMat vc =cvMat(5,5, CV_64FC1);   
  
    vc = *(cvGetRows(&va,&vb,0,3));  
  
    cout << "所要取的行为:"<< endl;  
    for(int i=0;i<vc.rows;i++)  
    {  
        for(int j=0;j<vc.cols;j++)  
            printf("%f\t",cvmGet(&vc,i,j));  
        cout << endl;  
    }  
    getchar();  
    return 0;  
}  
cvGetRows
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
int main()   
{   
    double a[5][5] =   
    {      
        {1,0,0,0,0},  
        {0,2,0,0,0},  
        {0,0,3,0,0},  
        {0,0,0,4,0},  
        {0,0,0,0,5}  
    };  
  
    CvMat va=cvMat(5,5, CV_64FC1,a);  
  
    cout<<"目标矩阵:"<<endl;  
  
    for(int i=0;i<5;i++)  
    {  
        for(int j=0;j<5;j++)  
            printf("%f\t",cvmGet(&va,i,j));  
        cout << endl;  
    }  
  
  
    CvMat vb =cvMat(5,5, CV_64FC1);  
    CvMat vc =cvMat(5,5, CV_64FC1);   
  
    vc = *(cvGetCols(&va,&vb,0,3));  
  
    cout << "所要取的列为:"<< endl;  
    for(int i=0;i<vc.rows;i++)  
    {  
        for(int j=0;j<vc.cols;j++)  
        printf("%f\t",cvmGet(&vc,i,j));  
        cout << endl;  
    }  
    getchar();  
    return 0;  
}  
cvGetCols
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
int main()   
{   
    double a[5][5] =   
    {      
        {1,0,0,0,6},  
        {0,2,0,7,0},  
        {0,0,3,0,0},  
        {0,9,0,4,0},  
        {8,0,0,0,5}  
    };  
  
    CvMat va=cvMat(5,5, CV_64FC1,a);  
  
    cout<<"目标矩阵:"<<endl;  
  
    for(int i=0;i<5;i++)  
    {  
        for(int j=0;j<5;j++)  
            printf("%f\t",cvmGet(&va,i,j));  
        cout << endl;  
    }  
  
    CvMat vb =cvMat(5,5, CV_64FC1);  
    CvMat vc =cvMat(5,5, CV_64FC1);   
  
    vc = *(cvGetDiag(&va,&vb,0));  
  
    cout << "所要取的对角线为:"<< endl;  
    for(int i=0;i<vc.rows;i++)  
    {  
        for(int j=0;j<vc.cols;j++)  
        printf("%f\t",cvmGet(&vc,i,j));  
        cout << endl;  
    }  
    getchar();  
    return 0;  
}  
cvGetDiag

  

  • 046. 矩阵中 最大最小值
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
int main()   
{   
    double a[3][3] =   
    {      
        {1,2,3},  
        {4,5,6},  
        {7,8,9}  
    };  
  
    CvMat va = cvMat(3,3, CV_64FC1,a);  
  
    cout<<"目标矩阵:"<<endl;  
  
    for(int i=0;i<3;i++)  
    {  
        for(int j=0;j<3;j++)  
            printf("%f\t",cvmGet(&va,i,j));  
        cout << endl;  
    }  
  
    double min_Val,max_Val;  
  
    cvMinMaxLoc(&va,&min_Val,&max_Val);  
  
    cout << "最小值为:" << endl;  
    cout << min_Val << endl;  
  
    cout << "最大值为:" << endl;  
    cout << max_Val << endl;  
  
    getchar();  
    return 0;  
  
}  
cvMinMaxLoc

 

  • 047. 矩阵中 非零的个数
View Code

 

  • 050. 向量的点积
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
  
int main()   
{   
    double va[] = {1,2,3};    
    double vb[] = {3,2,1};    
    CvMat Va=cvMat(3, 1, CV_64FC1, va);    
    CvMat Vb=cvMat(3, 1, CV_64FC1, vb);   
    cout << "其内积为:" << cvDotProduct(&Va,&Vb);     
    getchar();  
    return 0;  
}  
cvDotProduct

 

  • 051. 三维向量的叉积 
叉积,又名叉乘。 最早源自于三维向量空间的运算,因此也叫向量的外积,或者向量积。 两个三维向量的叉积等于一个新的向量, 该向量与前两者垂直,且长度为前两者张成的平行四边形面积, 其方向按照右手螺旋决定。
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <iostream>
using namespace std;


int main()
{
    double va[] = {3,0,0};
    double vb[] = {0,4,0};
    double vc[3];

    CvMat Va=cvMat(3, 1, CV_64FC1, va);
    CvMat Vb=cvMat(3, 1, CV_64FC1, vb);
    CvMat Vc=cvMat(3, 1, CV_64FC1, vc);

    cvCrossProduct(&Va, &Vb, &Vc);
    //显示向量element
    cout <<CV_MAT_ELEM(Vc,double,0,0)<<endl;
    cout <<CV_MAT_ELEM(Vc,double,1,0)<<endl;
    cout <<CV_MAT_ELEM(Vc,double,2,0)<<endl;
    getchar();
    return 0;
}
cvCrossProduct

  

cvSVD函数

cvSVBkSb函数

cvSVBkSb函数

posted @ 2016-07-08 17:58  郝壹贰叁  阅读(538)  评论(0编辑  收藏  举报