[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:两矩阵相乘;
- 常用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; }
- 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; }
下面的没有去点开关
#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; }
- 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)
#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; }
#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; }
#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; }
#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; }
#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; }
#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; }
- 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; }
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//结果图 );
#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; }
#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; }
#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; }
- 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; }
#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; }
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; }
- 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; }
- 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; }
- 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; }
#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; }
- 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()); }
该函数的使用 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; }
运行结果:
cov: [18, 18, 18; 18, 18, 18; 18, 18, 18] mu: [4, 5, 6]
该函数的使用 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); }
运行结果:
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
- 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; }
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; }
适用于小型矩阵。
- 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//变换标记 );
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; }
- 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; }
#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; }
- 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;
#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; }
void cvMul(//两个矩阵对应元素相乘 const CvArr* src1,//矩阵1 const CvArr* src2,//矩阵2 CvArr* dst,//结果矩阵 double scale = 1//因子系数 );
#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; }
- 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 );
#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; }
- 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; }
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; }
- 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; }
#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; }
#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; }
- 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; }
- 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; }
- 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; }
cvSVD函数
cvSVBkSb函数
cvSVBkSb函数