IplImage
一、资源
In this chapter, APIs will make U crazy. Good luck! Next, Review Linear Algebra.
Ref: http://blog.****.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函数