[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",)) != ))
- {
- int x = atoi("");
- int y = atoi("");
- int width = atoi("");
- int height = atoi("");
- int add = atoi("");
- cvShowImage( "Example3_12_pre", src);
- cvSetImageROI(src, cvRect(x,y,width,height)); // 设置专注范围
- cvAddS(src, cvScalar(add, , , ), src, NULL); // 只在专注的范围执行函数
- cvResetImageROI(src); // 如果注销,下一个函数(显示图像)则只会显示指定区域
- cvShowImage( "Example3_12_post",src);
- cvWaitKey();
- }
- cvReleaseImage( &src );
- cvDestroyWindow("Example3_12_pre");
- cvDestroyWindow("Example3_12_post");
- return ;
- }
- 多区域同时处理
但以下方式更加灵活,方便实现多区域同时处理。
- int main(int argc, char** argv)
- {
- IplImage* interest_img;
- CvRect interest_rect;
- if( argc == && ((interest_img=cvLoadImage(argv[],)) != ))
- {
- interest_rect.x = atoi(argv[]);
- interest_rect.y = atoi(argv[]);
- interest_rect.width = atoi(argv[]);
- interest_rect.height = atoi(argv[]);
- int add = atoi(argv[]);
- // 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 ;
- }
四、矩阵图像处理函数
全部API
- 、cvLoadImage:将图像文件加载至内存;
- 、cvNamedWindow:在屏幕上创建一个窗口;
- 、cvShowImage:在一个已创建好的窗口中显示图像;
- 、cvWaitKey:使程序暂停,等待用户触发一个按键操作;
- 、cvReleaseImage:释放图像文件所分配的内存;
- 、cvDestroyWindow:销毁显示图像文件的窗口;
- 、cvCreateFileCapture:通过参数设置确定要读入的AVI文件;
- 、cvQueryFrame:用来将下一帧视频文件载入内存;
- 、cvReleaseCapture:释放CvCapture结构开辟的内存空间;
- 、cvCreateTrackbar:创建一个滚动条;
- 、cvSetCaptureProperty:设置CvCapture对象的各种属性;
- 、cvGetCaptureProperty:查询CvCapture对象的各种属性;
- 、cvGetSize:当前图像结构的大小;
- 、cvSmooth:对图像进行平滑处理;
- 、cvPyrDown:图像金字塔,降采样,图像缩小为原来四分之一;
- 、cvCanny:Canny边缘检测;
- 、cvCreateCameraCapture:从摄像设备中读入数据;
- 、cvCreateVideoWriter:创建一个写入设备以便逐帧将视频流写入视频文件;
- 、cvWriteFrame:逐帧将视频流写入文件;
- 、cvReleaseVideoWriter:释放CvVideoWriter结构开辟的内存空间;
- 、CV_MAT_ELEM:从矩阵中得到一个元素;
- 、cvAbs:计算数组中所有元素的绝对值;
- 、cvAbsDiff:计算两个数组差值的绝对值;
- 、cvAbsDiffS:计算数组和标量差值的绝对值;
- 、cvAdd:两个数组的元素级的加运算;
- 、cvAddS:一个数组和一个标量的元素级的相加运算;
- 、cvAddWeighted:两个数组的元素级的加权相加运算(alpha运算);
- 、cvAvg:计算数组中所有元素的平均值;
- 、cvAvgSdv:计算数组中所有元素的绝对值和标准差;
- 、cvCalcCovarMatrix:计算一组n维空间向量的协方差;
- 、cvCmp:对两个数组中的所有元素运用设置的比较操作;
- 、cvCmpS:对数组和标量运用设置的比较操作;
- 、cvConvertScale:用可选的缩放值转换数组元素类型;
- 、cvCopy:把数组中的值复制到另一个数组中;
- 、cvCountNonZero:计算数组中非0值的个数;
- 、cvCrossProduct:计算两个三维向量的向量积(叉积);
- 、cvCvtColor:将数组的通道从一个颜色空间转换另外一个颜色空间;
- 、cvDet:计算方阵的行列式;
- 、cvDiv:用另外一个数组对一个数组进行元素级的除法运算;
- 、cvDotProduct:计算两个向量的点积;
- 、cvEigenVV:计算方阵的特征值和特征向量;
- 、cvFlip:围绕选定轴翻转;
- 、cvGEMM:矩阵乘法;
- 、cvGetCol:从一个数组的列中复制元素;
- 、cvGetCols:从数据的相邻的多列中复制元素;
- 、cvGetDiag:复制数组中对角线上的所有元素;
- 、cvGetDims:返回数组的维数;
- 、cvGetDimSize:返回一个数组的所有维的大小;
- 、cvGetRow:从一个数组的行中复制元素值;
- 、cvGetRows:从一个数组的多个相邻的行中复制元素值;
- 、cvGetSize:得到二维的数组的尺寸,以CvSize返回;
- 、cvGetSubRect:从一个数组的子区域复制元素值;
- 、cvInRange:检查一个数组的元素是否在另外两个数组中的值的范围内;
- 、cvInRangeS:检查一个数组的元素的值是否在另外两个标量的范围内;
- 、cvInvert:求矩阵的逆;
- 、cvMahalonobis:计算两个向量间的马氏距离;
- 、cvMax:在两个数组中进行元素级的取最大值操作;
- 、cvMaxS:在一个数组和一个标量中进行元素级的取最大值操作;
- 、cvMerge:把几个单通道图像合并为一个多通道图像;
- 、cvMin:在两个数组中进行元素级的取最小值操作;
- 、cvMinS:在一个数组和一个标量中进行元素级的取最小值操作;
- 、cvMinMaxLoc:寻找数组中的最大最小值;
- 、cvMul:计算两个数组的元素级的乘积(点乘);
- 、cvNot:按位对数组中的每一个元素求反;
- 、cvNormalize:将数组中元素进行归一化;
- 、cvOr:对两个数组进行按位或操作;
- 、cvOrs:在数组与标量之间进行按位或操作;
- 、cvReduce:通过给定的操作符将二维数组简为向量;
- 、cvRepeat:以平铺的方式进行数组复制;
- 、cvSet:用给定值初始化数组;
- 、cvSetZero:将数组中所有元素初始化为0;
- 、cvSetIdentity:将数组中对角线上的元素设为1,其他置0;
- 、cvSolve:求出线性方程组的解;
- 、cvSplit:将多通道数组分割成多个单通道数组;
- 、cvSub:两个数组元素级的相减;
- 、cvSubS:元素级的从数组中减去标量;
- 、cvSubRS:元素级的从标量中减去数组;
- 、cvSum:对数组中的所有元素求和;
- 、cvSVD:二维矩阵的奇异值分解;
- 、cvSVBkSb:奇异值回代计算;
- 、cvTrace:计算矩阵迹;
- 、cvTranspose:矩阵的转置运算;
- 、cvXor:对两个数组进行按位异或操作;
- 、cvXorS:在数组和标量之间进行按位异或操作;
- 、cvZero:将所有数组中的元素置为0;
- 、cvConvertScaleAbs:计算可选的缩放值的绝对值之后再转换数组元素的类型;
- 、cvNorm:计算数组的绝对范数, 绝对差分范数或者相对差分范数;
- 、cvAnd:对两个数组进行按位与操作;
- 、cvAndS:在数组和标量之间进行按位与操作;
- 、cvScale:是cvConvertScale的一个宏,可以用来重新调整数组的内容,并且可以将参数从一种数据类型转换为另一种;
- 、cvT:是函数cvTranspose的缩写;
- 、cvLine:画直线;
- 、cvRectangle:画矩形;
- 、cvCircle:画圆;
- 、cvEllipse:画椭圆;
- 、cvEllipseBox:使用外接矩形描述椭圆;
- 、cvFillPoly、cvFillConvexPoly、cvPolyLine:画多边形;
- 、cvPutText:在图像上输出一些文本;
- 、cvInitFont:采用一组参数配置一些用于屏幕输出的基本个特定字体;
- 、cvSave:矩阵保存;
- 、cvLoad:矩阵读取;
- 、cvOpenFileStorage:为读/写打开存储文件;
- 、cvReleaseFileStorage:释放存储的数据;
- 、cvStartWriteStruct:开始写入新的数据结构;
- 、cvEndWriteStruct:结束写入数据结构;
- 、cvWriteInt:写入整数型;
- 、cvWriteReal:写入浮点型;
- 、cvWriteString:写入字符型;
- 、cvWriteComment:写一个XML或YAML的注释字串;
- 、cvWrite:写一个对象;
- 、cvWriteRawData:写入多个数值;
- 、cvWriteFileNode:将文件节点写入另一个文件存储器;
- 、cvGetRootFileNode:获取存储器最顶层的节点;
- 、cvGetFileNodeByName:在映图或存储器中找到相应节点;
- 、cvGetHashedKey:为名称返回一个惟一的指针;
- 、cvGetFileNode:在映图或文件存储器中找到节点;
- 、cvGetFileNodeName:返回文件的节点名;
- 、cvReadInt:读取一个无名称的整数型;
- 、cvReadIntByName:读取一个有名称的整数型;
- 、cvReadReal:读取一个无名称的浮点型;
- 、cvReadRealByName:读取一个有名称的浮点型;
- 、cvReadString:从文件节点中寻找字符串;
- 、cvReadStringByName:找到一个有名称的文件节点并返回它;
- 、cvRead:将对象解码并返回它的指针;
- 、cvReadByName:找到对象并解码;
- 、cvReadRawData:读取多个数值;
- 、cvStartReadRawData:初始化文件节点序列的读取;
- 、cvReadRawDataSlice:读取文件节点的内容;
- 、cvGetModuleInfo:检查IPP库是否已经正常安装并且检验运行是否正常;
- 、cvResizeWindow:用来调整窗口的大小;
- 、cvSaveImage:保存图像;
- 、cvMoveWindow:将窗口移动到其左上角为x,y的位置;
- 、cvDestroyAllWindow:用来关闭所有窗口并释放窗口相关的内存空间;
- 、cvGetTrackbarPos:读取滑动条的值;
- 、cvSetTrackbarPos:设置滑动条的值;
- 、cvGrabFrame:用于快速将视频帧读入内存;
- 、cvRetrieveFrame:对读入帧做所有必须的处理;
- 、cvConvertImage:用于在常用的不同图像格式之间转换;
- 、cvErode:形态腐蚀;
- 、cvDilate:形态学膨胀;
- 、cvMorphologyEx:更通用的形态学函数;
- 、cvFloodFill:漫水填充算法,用来进一步控制哪些区域将被填充颜色;
- 、cvResize:放大或缩小图像;
- 、cvPyrUp:图像金字塔,将现有的图像在每个维度上都放大两倍;
- 、cvPyrSegmentation:利用金字塔实现图像分割;
- 、cvThreshold:图像阈值化;
- 、cvAcc:可以将8位整数类型图像累加为浮点图像;
- 、cvAdaptiveThreshold:图像自适应阈值;
- 、cvFilter2D:图像卷积;
- 、cvCopyMakeBorder:将特定的图像轻微变大,然后以各种方式自动填充图像边界;
- 、cvSobel:图像边缘检测,Sobel算子;
- 、cvLaplace:拉普拉斯变换、图像边缘检测;
- 、cvHoughLines2:霍夫直线变换;
- 、cvHoughCircles:霍夫圆变换;
- 、cvRemap:图像重映射,校正标定图像,图像插值;
- 、cvWarpAffine:稠密仿射变换;
- 、cvGetQuadrangleSubPix:仿射变换;
- 、cvGetAffineTransform:仿射映射矩阵的计算;
- 、cvCloneImage:将整个IplImage结构复制到新的IplImage中;
- 、cv2DRotationMatrix:仿射映射矩阵的计算;
- 、cvTransform:稀疏仿射变换;
- 、cvWarpPerspective:密集透视变换(单应性);
- 、cvGetPerspectiveTransform:计算透视映射矩阵;
- 、cvPerspectiveTransform:稀疏透视变换;
- 、cvCartToPolar:将数值从笛卡尔空间到极坐标(极性空间)进行映射;
- 、cvPolarToCart:将数值从极性空间到笛卡尔空间进行映射;
- 、cvLogPolar:对数极坐标变换;
- 、cvDFT:离散傅里叶变换;
- 、cvMulSpectrums:频谱乘法;
- 、cvDCT:离散余弦变换;
- 、cvIntegral:计算积分图像;
- 、cvDistTransform:图像的距离变换;
- 、cvEqualizeHist:直方图均衡化;
- 、cvCreateHist:创建一新直方图;
- 、cvMakeHistHeaderForArray:根据已给出的数据创建直方图;
- 、cvNormalizeHist:归一化直方图;
- 、cvThreshHist:直方图阈值函数;
- 、cvCalcHist:从图像中自动计算直方图;
- 、cvCompareHist:用于对比两个直方图的相似度;
- 、cvCalcEMD2:陆地移动距离(EMD)算法;
- 、cvCalcBackProject:反向投影;
- 、cvCalcBackProjectPatch:图块的方向投影;
- 、cvMatchTemplate:模板匹配;
- 、cvCreateMemStorage:用于创建一个内存存储器;
- 、cvCreateSeq:创建序列;
- 、cvSeqInvert:将序列进行逆序操作;
- 、cvCvtSeqToArray:复制序列的全部或部分到一个连续内存数组中;
- 、cvFindContours:从二值图像中寻找轮廓;
- 、cvDrawContours:绘制轮廓;
- 、cvApproxPoly:使用多边形逼近一个轮廓;
- 、cvContourPerimeter:轮廓长度;
- 、cvContoursMoments:计算轮廓矩;
- 、cvMoments:计算Hu不变矩;
- 、cvMatchShapes:使用矩进行匹配;
- 、cvInitLineIterator:对任意直线上的像素进行采样;
- 、cvSampleLine:对直线采样;
- 、cvAbsDiff:帧差;
- 、cvWatershed:分水岭算法;
- 、cvInpaint:修补图像;
- 、cvGoodFeaturesToTrack:寻找角点;
- 、cvFindCornerSubPix:用于发现亚像素精度的角点位置;
- 、cvCalcOpticalFlowLK:实现非金字塔的Lucas-Kanade稠密光流算法;
- 、cvMeanShift:mean-shift跟踪算法;
- 、cvCamShift:camshift跟踪算法;
- 、cvCreateKalman:创建Kalman滤波器;
- 、cvCreateConDensation:创建condensation滤波器;
- 、cvConvertPointsHomogenious:对齐次坐标进行转换;
- 、cvFindChessboardCorners:定位棋盘角点;
- 、cvFindHomography:计算单应性矩阵;
- 、cvRodrigues2:罗德里格斯变换;
- 、cvFitLine:直线拟合算法;
- 、cvCalcCovarMatrix:计算协方差矩阵;
- 、cvInvert:计算协方差矩阵的逆矩阵;
- 、cvMahalanobis:计算Mahalanobis距离;
- 、cvKMeans2:K均值;
- 、cvCloneMat:根据一个已有的矩阵创建一个新矩阵;
- 、cvPreCornerDetect:计算用于角点检测的特征图;
- 、cvGetImage:CvMat图像数据格式转换成IplImage图像数据格式;
- 、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[];
- argvv[] = "/home/unsw/lolo.jpg";
- argvv[] = "/home/unsw/lolo2.jpg";
- argvv[] = "";
- argvv[] = "";
- argvv[] = "";
- argvv[] = "";
- argvv[] = "";
- argvv[] = "0.1";
- IplImage *src1, *src2;
- if( ((src1=cvLoadImage(argvv[],)) != ) &&
- ((src2=cvLoadImage(argvv[],)) != ))
- {
- int x = atoi(argvv[]);
- int y = atoi(argvv[]);
- int width = atoi(argvv[]);
- int height = atoi(argvv[]);
- double alpha = (double)atof(argvv[]);
- double beta = (double)atof(argvv[]);
- cvSetImageROI(src1, cvRect(x,y,width,height));
- cvSetImageROI(src2, cvRect(,,width,height));
- // 图片混合显示
- cvAddWeighted(src1, alpha, src2, beta, 0.0, src1);
- cvResetImageROI(src1);
- cvNamedWindow( "Alpha_blend", );
- cvShowImage( "Alpha_blend", src1 );
- cvWaitKey();
- }
- else
- printf("Couldn't load one or both of %s, %s\n",argvv[],argvv[]);
- return ;
- }
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 ;
- }
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 ;
- }
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 ;
- }
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 ;
- }
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 ;
- }
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,,src1);
- cvShowImage( "测试1", src1);
- cvShowImage( "测试2", src2);
- cvWaitKey();
- return ;
- }
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 ;
- }
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,,src1);
- cvShowImage( "测试1", src1);
- cvShowImage( "测试2", src2);
- cvWaitKey();
- return ;
- }
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 ;
- }
- 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 均值、标准差
- #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,);
- R=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,);
- G=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,);
- B=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,);
- H=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,);
- S=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,);
- V=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,);
- two=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,);
- Zero=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,);
- 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,);//分离多通道
- cvSplit(change,H,S,V,);//分离多通道
- //显示RGB图单通道图
- cvShowImage("image",image);
- cvShowImage("Zero",Zero);
- cvShowImage("R",R);
- cvShowImage("G",G);
- cvShowImage("B",B);
- cvMerge(R,G,Zero,,two); //合并两个图像空间
- cvShowImage("RG",two);//显示B通道为空白时的图像
- cvMerge(Zero,G,B,,two);
- cvShowImage("BG",two);
- cvMerge(R,Zero,B,,two);
- cvShowImage("RB",two);
- cvMerge(H,S,Zero,,two);
- cvCvtColor(two,change,CV_HSV2RGB);//cvShowImage是按照RGB色彩方式显示图像的,故要通过RGB色系展示对HSV色系的更改效果
- cvShowImage("HS",change);
- cvMerge(Zero,S,V,,two);
- cvCvtColor(two,change,CV_HSV2RGB);//cvShowImage是按照RGB色彩方式显示图像的,故要通过RGB色系展示对HSV色系的更改效果
- cvShowImage("VS",change);
- cvMerge(H,Zero,V,,two);
- cvCvtColor(two,change,CV_HSV2RGB);//cvShowImage是按照RGB色彩方式显示图像的,故要通过RGB色系展示对HSV色系的更改效果
- cvShowImage("HV",change);
- cvWaitKey();
- cvDestroyAllWindows();
- cvReleaseImage(&image);
- cvReleaseImage(&change);
- }
- system("pause");
- return ;
- }
多通道分解实例
- 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, );
- dst12 = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, );
- dst13 = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, );
- cvSplit(src1, dst11, dst12, dst13, );//分解
- cvMerge(dst11,dst12,dst13,NULL,src2); //再合并
- cvShowImage( "测试", src2);
- cvWaitKey();
- return ;
- }
多通道合并实例
- #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",);
- CvScalar cs = cvSum(src1);
- cout << "通道一总和:";
- cout << cs.val[] << endl;
- cout << "通道二总和:";
- cout << cs.val[] << endl;
- cout << "通道三总和:";
- cout << cs.val[] << endl;
- cout << "通道四总和:";
- cout << cs.val[] << endl;
- getchar();
- return ;
- }
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[] << endl;
- cout<<cs.val[] << endl;
- cout<<cs.val[] << endl;
- cout<<cs.val[] << endl;
- getchar();
- return ;
- }
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[] << endl;
- cout<<cs.val[] << endl;
- cout<<cs.val[] << endl;
- cout<<cs.val[] << endl;
- cout <<endl;
- cout <<"标准差"<<endl;
- cout<<cs1.val[] << endl;
- cout<<cs1.val[] << endl;
- cout<<cs1.val[] << endl;
- cout<<cs1.val[] << endl;
- getchar();
- return ;
- }
cvAvgSdv附送标准差
- 012. 轴翻转
- 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 ;
- }
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 ;
- }
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(-);
- return ;
- }
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 ;
- }
cvGetSize
- 015. 截取图像区域
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- IplImage *res;
- int subX = ;
- int subY = ;
- CvMat matSrc;
- res = cvLoadImage("1.jpg", CV_LOAD_IMAGE_COLOR);
- subX = res->width / ;
- subY = res->height / ;
- CvMat *pMat = cvGetSubRect(res, &matSrc, cvRect(, , res->width - subX, res->height - subY));
- IplImage *pSubImg = cvCreateImageHeader(cvSize(, ), , );
- cvGetImage(pMat, pSubImg);
- cvShowImage("所截图像",pSubImg);
- cvShowImage("原图像", res);
- cvWaitKey();
- return ;
- }
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[] = ;
- cs.val[] = ;
- cs.val[] = ;
- cs.val[] = ;
- cvSet(src1,cs);
- cvShowImage( "结果图", src1);
- cvShowImage( "原图", src2);
- cvWaitKey();
- return ;
- }
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[] = ;
- cs.val[] = ;
- cs.val[] = ;
- cs.val[] = ;
- cvSetZero(src1);
- cvShowImage( "结果图", src1);
- cvShowImage( "原图", src2);
- cvWaitKey();
- return ;
- }
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 != && count >= );
- if( avgarr )
- mean = mean0 = cv::cvarrToMat(avgarr);
- if( (flags & CV_COVAR_COLS) != || (flags & CV_COVAR_ROWS) != )
- {
- cv::Mat data = cv::cvarrToMat(vecarr[]);
- cv::calcCovarMatrix( data, cov, mean, flags, cov.type() );
- }
- else
- {
- std::vector<cv::Mat> data(count);
- for( int i = ; i < count; i++ )
- data[i] = cv::cvarrToMat(vecarr[i]);
- cv::calcCovarMatrix( &data[], 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>(, ) << 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 ;
- }
运行结果:
- cov:
- [, , ;
- , , ;
- , , ]
- mu:
- [, , ]
该函数的使用 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 = ;
- const int cols = ;
- // Input matrix
- float x[rows][cols] = {{, , },
- {, , }};
- // Place input into CvMat**
- CvMat** input = new CvMat*[rows];
- for(int i=; i<rows; i++) {
- input[i] = cvCreateMat(, cols, CV_32FC1);
- for(int j=; j<cols; j++) {
- cvmSet(input[i], , 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(, 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=; i<n; i++) {
- for(int j=; 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 - ));
- cout << "\t";
- }
- cout << endl;
- }
- return();
- }
运行结果:
- Covariance matrix:
- (,): 12.500000 (,): -2.500000 (,): -112.500000
- (,): -2.500000 (,): 0.500000 (,): 22.500000
- (,): -112.500000 (,): 22.500000 (,): 1012.500000
- 021. 转置矩阵
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- double a[][] =
- {
- {,,,,},
- {,,,,},
- {,,,,},
- {,,,,},
- {,,,,}
- };
- CvMat va = cvMat(,, CV_64FC1,a);
- double b[][] = {};
- CvMat vb = cvMat(,, CV_64FC1,b);
- cout<<"目标矩阵:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&va,i,j));
- cout << endl;
- }
- cvTranspose(&va,&vb);
- cout<<"结果矩阵:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&vb,i,j));
- cout << endl;
- }
- getchar();
- return ;
- }
cvTranspose
cvNorm函数
cvNormalize函数
cvReduce函数
- 030. 计算矩阵的 行列式
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- double va[] = {,,,,,,,,};
- CvMat Va=cvMat(, , CV_64FC1, va);
- cout << "该矩阵的行列式的值为"<<cvDet(&Va) << endl;
- getchar();
- return ;
- }
适用于小型矩阵。
- 031. 矩阵的 特征值 和 特征向量
- 032. 矩阵 乘法
- double cvGEMM(//矩阵的广义乘法运算
- const CvArr* src1,//乘数矩阵
- const CvArr* src2,//乘数矩阵
- double alpha,//1号矩阵系数
- const CvArr* src3,//加权矩阵
- double beta,//2号矩阵系数
- CvArr* dst,//结果矩阵
- int tABC = //变换标记
- );
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[][] =
- {
- {,,},
- {,,},
- {,,}
- };
- CvMat va=cvMat(,, CV_64FC1,a);
- cout<<"目标矩阵1:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&va,i,j));
- cout << endl;
- }
- double b[][] =
- {
- {,,},
- {,,},
- {,,}
- };
- CvMat vb =cvMat(, , CV_64FC1, b);
- cout<<"目标矩阵2:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&vb,i,j));
- cout << endl;
- }
- double c[][] = {,,,,,,,,};
- CvMat vc = cvMat(,, CV_64FC1, c);
- cvGEMM(&va,&vb,,&vc,,&vc);
- cout << "结果矩阵:"<< endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&vc,i,j));
- cout << endl;
- }
- getchar();
- return ;
- }
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 ;
- }
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("",src1);
- cvShowImage("",src2);
- cvShowImage("",src3);
- cvWaitKey();
- return ;
- }
cvSub
- 040. 矩阵各元素 初始化
- 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[] = {,,,,,,,,};
- CvMat Va=cvMat(, , CV_64FC1, va);
- double vb[] = {,,,,,,,,};
- CvMat Vb=cvMat(, , CV_64FC1, vb);
- cout<< "矩阵A:"<<endl;
- for(int i = ;i < ; i++)
- {
- for(int j = ; j < ; j++)
- cout << CV_MAT_ELEM(Va,double,i,j)<<" ";
- cout << endl;
- }
- cout<< "矩阵B:"<<endl;
- for(int i = ;i < ; i++)
- {
- for(int j = ; j < ; j++)
- cout << CV_MAT_ELEM(Vb,double,i,j)<<" ";
- cout << endl;
- }
- cvDiv(&Va,&Vb,&Va,);
- cout<< "运算后的矩阵:"<<endl;
- for(int i = ;i < ; i++)
- {
- for(int j = ; j < ; j++)
- cout << CV_MAT_ELEM(Va,double,i,j)<<" ";
- cout << endl;
- }
- getchar();
- return ;
- }
cvDiv
- void cvMul(//两个矩阵对应元素相乘
- const CvArr* src1,//矩阵1
- const CvArr* src2,//矩阵2
- CvArr* dst,//结果矩阵
- double scale = //因子系数
- );
cvMul
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- double a[][] =
- {
- {,,},
- {,,},
- {,,}
- };
- CvMat va = cvMat(,, CV_64FC1,a);
- double b[][] =
- {
- {,,},
- {,,},
- {,,}
- };
- CvMat vb = cvMat(,, CV_64FC1,b);
- cout<<"目标矩阵:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&va,i,j));
- cout << endl;
- }
- cout<<"因子矩阵:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&vb,i,j));
- cout << endl;
- }
- cvMul(&va,&vb,&va);
- cout<<"结果矩阵:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&va,i,j));
- cout << endl;
- }
- getchar();
- return ;
- }
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(,,CV_32FC1);
- float value = 0.0;
- int i = , j = ;
- cout<<"初始化原始数组"<<endl;
- for ( i = ; i < ; i ++ ){
- for( j = ; j < ; j ++ ){
- value -= 1.0; // 赋值 -1 --> -16
- CV_MAT_ELEM( *mat, float, i, j) = value;
- }
- }
- for ( i = ; i < ; i ++ ){
- for( j = ; j < ; j ++ ){
- cout<<"\t"<<CV_MAT_ELEM( *mat, float, i, j);
- }
- cout<<endl;
- }
- CvMat *matDes;
- matDes=cvCreateMat(,,CV_32FC1);
- cout<<"目标矩阵"<<endl;
- for ( i = ; i < ; i ++ ){
- for( j = ; j < ; j ++ ){
- cvmSet( matDes, i, j,);
- cout<<"\t"<<CV_MAT_ELEM( *matDes, float, i, j);
- }
- cout<<endl;
- }
- cvAbs( mat, matDes );
- cout<<"数组的绝对值"<<endl;
- for ( i = ; i < ; i ++ ){
- for( j = ; j < ; j ++ ){
- cout<<"\t"<<CV_MAT_ELEM( *matDes, float, i, j);
- }
- cout<<endl;
- }
- CvMat *matDiff1 = cvCreateMat(,,CV_32FC1);
- cvAbsDiff( mat,matDes , matDiff1);
- cout<<"两个差的绝对值"<<endl;
- for ( i = ; i < ; i ++ ){
- for( j = ; j < ; j ++ ){
- cout<<"\t"<<CV_MAT_ELEM( *matDiff1, float, i, j);
- }
- cout<<endl;
- }
- CvScalar cs;
- cs.val[] = 2.0;
- cs.val[] = 1.0;
- cvAbsDiffS( mat, matDiff1,cs);
- cout<<"矩阵减去标准值的绝对值"<<endl;
- for ( i = ; i < ; i ++ ){
- for( j = ; j < ; j ++ ){
- cout<<"\t"<<CV_MAT_ELEM( *matDiff1, float, i, j);
- }
- cout<<endl;
- }
- cvReleaseMat( &mat );
- cvReleaseMat( &matDes );
- getchar();
- return ;
- }
- 043. 矩阵中各元素 逻辑运算
- #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 ;
- }
cvAnd
- 044. 矩阵的维度和大小
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- double a[][] =
- {
- {,,,,},
- {,,,,},
- {,,,,},
- {,,,,},
- {,,,,}
- };
- CvMat va=cvMat(,, CV_64FC1,a);
- cout<<"目标矩阵:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&va,i,j));
- cout << endl;
- }
- int sizes[] = {};
- int v = cvGetDims(&va,sizes);
- cout << "矩阵的维数:";
- cout << v << endl;
- cout << "每个维度上的大小:"<<endl;
- for(int i = ; i<&&sizes[i]!=;i++)
- cout << sizes[i] << endl;
- getchar();
- return ;
- }
cvGetDims
- 045. 矩阵的 某行 or 某列 or 对角线
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- double a[][] =
- {
- {,,,,},
- {,,,,},
- {,,,,},
- {,,,,},
- {,,,,}
- };
- CvMat va=cvMat(,, CV_64FC1,a);
- cout<<"目标矩阵:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&va,i,j));
- cout << endl;
- }
- CvMat vb =cvMat(,, CV_64FC1);
- CvMat vc =cvMat(,, CV_64FC1);
- vc = *(cvGetRows(&va,&vb,,));
- cout << "所要取的行为:"<< endl;
- for(int i=;i<vc.rows;i++)
- {
- for(int j=;j<vc.cols;j++)
- printf("%f\t",cvmGet(&vc,i,j));
- cout << endl;
- }
- getchar();
- return ;
- }
cvGetRows
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- double a[][] =
- {
- {,,,,},
- {,,,,},
- {,,,,},
- {,,,,},
- {,,,,}
- };
- CvMat va=cvMat(,, CV_64FC1,a);
- cout<<"目标矩阵:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&va,i,j));
- cout << endl;
- }
- CvMat vb =cvMat(,, CV_64FC1);
- CvMat vc =cvMat(,, CV_64FC1);
- vc = *(cvGetCols(&va,&vb,,));
- cout << "所要取的列为:"<< endl;
- for(int i=;i<vc.rows;i++)
- {
- for(int j=;j<vc.cols;j++)
- printf("%f\t",cvmGet(&vc,i,j));
- cout << endl;
- }
- getchar();
- return ;
- }
cvGetCols
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- double a[][] =
- {
- {,,,,},
- {,,,,},
- {,,,,},
- {,,,,},
- {,,,,}
- };
- CvMat va=cvMat(,, CV_64FC1,a);
- cout<<"目标矩阵:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;j++)
- printf("%f\t",cvmGet(&va,i,j));
- cout << endl;
- }
- CvMat vb =cvMat(,, CV_64FC1);
- CvMat vc =cvMat(,, CV_64FC1);
- vc = *(cvGetDiag(&va,&vb,));
- cout << "所要取的对角线为:"<< endl;
- for(int i=;i<vc.rows;i++)
- {
- for(int j=;j<vc.cols;j++)
- printf("%f\t",cvmGet(&vc,i,j));
- cout << endl;
- }
- getchar();
- return ;
- }
cvGetDiag
- 046. 矩阵中 最大最小值
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- double a[][] =
- {
- {,,},
- {,,},
- {,,}
- };
- CvMat va = cvMat(,, CV_64FC1,a);
- cout<<"目标矩阵:"<<endl;
- for(int i=;i<;i++)
- {
- for(int j=;j<;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 ;
- }
cvMinMaxLoc
- 047. 矩阵中 非零的个数
- 050. 向量的点积
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- double va[] = {,,};
- double vb[] = {,,};
- CvMat Va=cvMat(, , CV_64FC1, va);
- CvMat Vb=cvMat(, , CV_64FC1, vb);
- cout << "其内积为:" << cvDotProduct(&Va,&Vb);
- getchar();
- return ;
- }
cvDotProduct
- 051. 三维向量的叉积
- 叉积,又名叉乘。 最早源自于三维向量空间的运算,因此也叫向量的外积,或者向量积。 两个三维向量的叉积等于一个新的向量, 该向量与前两者垂直,且长度为前两者张成的平行四边形面积, 其方向按照右手螺旋决定。
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- double va[] = {,,};
- double vb[] = {,,};
- double vc[];
- CvMat Va=cvMat(, , CV_64FC1, va);
- CvMat Vb=cvMat(, , CV_64FC1, vb);
- CvMat Vc=cvMat(, , CV_64FC1, vc);
- cvCrossProduct(&Va, &Vb, &Vc);
- //显示向量element
- cout <<CV_MAT_ELEM(Vc,double,,)<<endl;
- cout <<CV_MAT_ELEM(Vc,double,,)<<endl;
- cout <<CV_MAT_ELEM(Vc,double,,)<<endl;
- getchar();
- return ;
- }
cvCrossProduct
cvSVD函数
cvSVBkSb函数
cvSVBkSb函数
[OpenCV] IplImage and Operation的更多相关文章
- OpenCV IplImage FlyCapture2 Image Conversion 两种图像类的相互转化
OpenCV的IplImag和 FlyCapture2 的 Image是两种常见的图片格式,在实际的应用中,我们通常要混合使用OpenCV和FlyCapture2这两个SDK,所以这两种图片格式之间的 ...
- FlyCapture2 fc2Image OpenCV IplImage Conversion 两种图像格式之间的转换
fc2Image是FlyCapture SDK的C语言库中的图片格式,由于在Windows上的MinGW无法编译FlyCapture2的C++库,只能使用C语言库,所以当我们在同时使用OpenCV的图 ...
- [OpenCV] IplImage and Functions
In this chapter, APIs will make U crazy. Good luck! Next, Review Linear Algebra. Ref: http://blog.c ...
- opencv Iplimage结构简介
IplImage 结构解读: typedef struct _IplImage{int nSize; /* IplImage大小 */int ID; ...
- OpenCV——IplImage
IplImage结构: typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; /* 版本 (=0)*/ int nChannel ...
- opencv——IplImage结构
一.作业要求: 采用MATLAB或opencv+C编程实现.每一题写明题目,给出试验程序代码,实验结果图片命名区分并作出效果比对,最后实验总结说明每一题蕴含的图像处理方法的效果以及应用场合等. 采用M ...
- OpenCV ——IplImage应用解析
由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构.IplImage结构来源于Intel的另外一个函数库Intel Image Processing ...
- opencv IplImage各参数详细介绍以及如何从一个JPEG图像数据指针转换得到IplImage
这篇文章里介绍得最清楚了.http://blog.chinaunix.net/uid-22682903-id-1771421.html 关于颜色空间 RGB颜色空间已经非常熟悉了.HSV颜色空间需要 ...
- [Python] python vs cplusplus
一些学习过程中的总结的两种语言的小对比,帮助理解OO programming. Continue... 字典 序列 --> 字典 Python: def get_counts(sequence) ...
随机推荐
- 修复Windows10系统的注册表?
在打开的管理员命令提示符窗口,输入如下命令: ———————————————————————————————— reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Mi ...
- ELK(Logstash+Elasticsearch+Kibana)的原理和详细搭建
一. Elastic Stack Elastic Stack是ELK的官方称呼,网址:https://www.elastic.co/cn/products ,其作用是“构建在开源基础之上, Elast ...
- Java中的this和super
在Java中有两个非常特殊的变量:this和super,这两个变量在使用前都是不需要声明的.this变量使用在一个成员函数的内部,指向当前对象,当前对象指的是调用当前正在执行方法的那个对象.super ...
- sps和pps的简单理解记录
最近博客写出了日记的既视感... 使用RTP传输H264的时候,需要用到sdp协议描述,其中有两项:Sequence Parameter Sets (SPS) 和Picture Parameter S ...
- css布局你该了解的
记录一下: static :默认值:默认布局. fixed :固定定位:类似于absolute,但不随着滚动条的移动而改变位置. float: 给元素的float属性赋值后,就是脱离文档流,进行左右浮 ...
- CSS2.0中最常用的18条技巧
一.使用css缩写 使用缩写可以帮助减少你CSS文件的大小,更加容易阅读. 具体内容请浏览:CSS常用缩写语法 二.明确定义单位,除非值为0. 忘记定义尺寸的单位是CSS新手普遍的错误.在HTML中 ...
- Qt Creator设置多核编译(-j8参数)
In the qtcreator go to the "Projects tab" and set "Make arguments" as you like: ...
- VIM下的可视模式的相关知识
三种可视模式: v 激活面向字符的可视模式: V 激活面向行的可视模式: ctrl+v 激活面向列块的可视模式: 选择高亮区: 上面的 v 是可以与跳转指令 以及表示范围的指令组合使用的. 如:vl, ...
- 第三百七十八节,Django+Xadmin打造上线标准的在线教育平台—django自带的admin后台管理介绍
第三百七十八节,Django+Xadmin打造上线标准的在线教育平台—django自带的admin后台管理介绍 配置django的admin数据库管理后台 首先urls.py配置数据库后台路由映射,一 ...
- Java内存、CPU占用率过高
windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码 linux下查找java进程占用CPU过高原因 Java 占用CPU使用率很高的分析 记一次线上Java程序导致服 ...