opencv例子注释.docx
- 文档编号:15204828
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:21
- 大小:197.43KB
opencv例子注释.docx
《opencv例子注释.docx》由会员分享,可在线阅读,更多相关《opencv例子注释.docx(21页珍藏版)》请在冰点文库上搜索。
opencv例子注释
3.1(CvMat的矩阵头结构)
#include"stdio.h"
#include"cv.h"
intmain(){
typedefstructCvMat{
inttype;//矩阵元素类型。
通常以CV_<比特数>(S|U|F)C<通道数>形式来描述
intstep;//排列后的数据的整个行宽,默认状态下,使用STEP的最小可能值。
也就是说默认情况下假定矩阵的行与行之间无隙
int*refcount;//数据引用计数
union{//指向数据区首地址的指针
uchar*ptr;
short*s;
int*i;
float*fl;
double*db;
}data;
union{
introws;//矩阵的行数
intheight;//矩阵的高度
};
union{
intcols;//矩阵的列数
intwidth;//矩阵的宽度
};
}CvMat;
}
3.2(矩阵的创建、拷贝和释放)
#include"stdio.h"
#include"cv.h"
intmain(){
CvMat*cvCreateMat(introws,intcols,inttype);//创建矩阵并分配内存
CvMat*cvCreateMatHeader(introws,intcols,inttype);//创建新的矩阵头但不分配内存
CvMat*cvInitMatHeader(//初始化矩阵头
CvMat*mat,//指针指向要被初始化的矩阵头
introws,//矩阵的行数
intcols,//矩阵的列数
inttype,//矩阵通用数据类型
void*data=NULL,//可选的,将指向数据指针分配给矩阵头
intstep=CV_AUTOSTEP//矩阵行宽自动设置
);
CvMatcvMat(//函数CvMat是一个快速内连函数,替代函数cvInitMatHeader.也就是说它相当于:
CvMatmat;
cvInitMatHeader(&mat,rows,cols,type,data,CV_AUTOSTEP);
introws,
intcols,
inttype,
void*data=NULL
);
CvMat*cvCloneMat(constCvMat*mat);//创建已有矩阵的一个拷贝并且返回该矩阵的指针
voidcvReleaseMat(CvMat**mat);//缩减矩阵数据参考计数并且释放矩阵头
}
3.3(用固定数据创建一个OpenCv矩阵)
#include"cv.h"
#include
intmain()
{
//CreateanOpenCVMatrixcontainingsomefixeddata.
////创建一个OpenCv矩阵,该矩阵包含一些固定的数据
floatvals[]={0.866025f,-0.500000f,0.500000f,0.866025f};//为数组赋值
CvMatrotmat;//声明Cvmat类型的变量
cvInitMatHeader(//同3-2
&rotmat,
2,
2,
CV_32FC1,
vals
);
printf("Ex3_3matrixinitialized\n");
}
3.4(利用CV_MAT_ELEM()宏存取矩阵)
#include"cv.h"
#include
intmain()
{
CvMat*mat=cvCreateMat(5,5,CV_32FC1);//一个32-bit有符号二个通道的矩阵
floatelement_3_2=CV_MAT_ELEM(*mat,float,3,2);//获得矩阵元素的值
printf("Exercise3_4,matrixcreatedandaccessed[3,2]=%f\n",element_3_2);
}
3.5(为矩阵设置一个值)
#include"cv.h"
#include
intmain()
{
CvMat*mat=cvCreateMat(5,5,CV_32FC1);//分配矩阵空间
floatelement_3_2=7.7;
*((float*)CV_MAT_ELEM_PTR(*mat,3,2))=element_3_2;//利用CV_MAT_ELEM_PTR()宏为矩阵设置一个数值
cvmSet(mat,2,2,0.5000);//处理浮点型单通道矩阵
cvSetReal2D(mat,3,3,0.3300);
printf("Exercise3_5,matrixcreatedandaccessed[3,2]=%f,[2,2]=%f,[3,3]=%f\n",CV_MAT_ELEM(*mat,float,3,2),CV_MAT_ELEM(*mat,float,2,2),CV_MAT_ELEM(*mat,float,3,3));//输出
}
3.6(指针访问矩阵结构)
#include"cv.h"
#include
intmain()
{
uchar*cvPtr1D(
constCvArr*arr,//输入矩阵数组
intidx0,//元素下标的第一个0位基准的成员
int*type=NULL//表示输出参数的数据类型初始化
);
uchar*cvPtr2D(
constCvArr*arr,
intidx0,
intidx1,//元素下标的第二个0位基准的成员
int*type=NULL//表示输出参数的数据类型初始化
);
uchar*cvPtr3D(
constCvArr*arr,
intidx0,
intidx1,
intidx2,//元素下标的第三个0位基准的成员
int*type=NULL
);
uchar*cvPtrND(
constCvArr*arr,
int*idx,
int*type=NULL,
intcreate_node=1,//为稀疏矩阵输入的参数
unsigned*precalc_hashval=NULL
);
}
3.7
#include"cv.h"
#include
intmain()
{//对于稀疏数组如果需要的节点不存在函数返回0,不会创建新的节点
doublecvGetReal1D(constCvArr*arr,intidx0);//cvGetReal*D是返回制定的数组元素,arr表示输入数组,必须是单通道,idx0-idx2均表示元素下标的数组,以0为基准
doublecvGetReal2D(constCvArr*arr,intidx0,intidx1);
doublecvGetReal3D(constCvArr*arr,intidx0,intidx1,intidx2);
doublecvGetRealND(constCvArr*arr,int*idx);
CvScalarcvGet1D(constCvArr*arr,intidx0);
CvScalarcvGet2D(constCvArr*arr,intidx0,intidx1);
CvScalarcvGet3D(constCvArr*arr,intidx0,intidx1,intidx2);
CvScalarcvGetND(constCvArr*arr,int*idx);
}
3.8
#include"cv.h"
#include
intmain()
{//cvSetReal1*D是用于修改指定数组元素值
voidcvSetReal1D(CvArr*arr,intidx0,doublevalue);
voidcvSetReal2D(CvArr*arr,intidx0,intidx1,doublevalue);
voidcvSetReal3D(
CvArr*arr,
intidx0,
intidx1,
intidx2,
doublevalue//表示指派的值
);
//函数cvSetReal*D分配新的值给单通道数组的指定元素,如果数组是多通道就会产生运行时的错误。
//cvSet*D可以安全的被用于多通道和单通道数组
voidcvSetRealND(CvArr*arr,int*idx,doublevalue);
voidcvSet1D(CvArr*arr,intidx0,CvScalarvalue);
voidcvSet2D(CvArr*arr,intidx0,intidx1,CvScalarvalue);
voidcvSet3D(
CvArr*arr,
intidx0,
intidx1,
intidx2,
CvScalarvalue
);
voidcvSetND(CvArr*arr,int*idx,CvScalarvalue);
}
3.9
#include
#include
#include
中累加一个三通道矩阵中的所有元素
floatsum(CvMat*mat){
floats=0.0f;
//mat->data.ptr是指向mat中数据的指针,是char的,而mat中的数据是float的。
for(introw=0;row
//mat->step是mat中每行数据的长度
float*ptr=mat->data.fl+row*mat->step/4;
for(intcol=0;col
s+=*ptr++;//将整个CvMat看成一个二维矩阵,则矩阵中的每个元素是三维向量将它们累加
}
}
return(s);
};
intmain(intargc,char**argv)
{
CvMat*mat=cvCreateMat(5,5,CV_32FC1);//创建矩阵,其元素为三通道浮点数
floatelement_3_2=7.7;
*((float*)CV_MAT_ELEM_PTR(*mat,3,2))=element_3_2;
cvmSet(mat,4,4,0.5000);
cvSetReal2D(mat,3,3,0.5000);
floats=sum(mat);
printf("%f\n",s);
return0;
}
3.10(IplImage图像头结构)
#include
#include
intmain()
{
typedefstruct_IplImage{
intnSize;//IplImage大小
intID;//版本
intnChannels;//大多OPENCV函数支持1,2,3或4个通道
intalphaChannel;//被OPENCV忽略
intdepth;//像素的位深度
charcolorModel[4];//被OPENCV忽略
charchannelSeq[4];//被OPENCV忽略
intdataOrder;//0-交叉存取颜色通道,1-分开的颜色通道
intorigin;//0-顶-左结构,1–底-左结构(BMP风格)
intalign;//图像行排列(4or8)OpenCV用widthStep代替
intwidth;//图像宽像素数
intheight;//图像高像素数
struct_IplROI*roi;//图像感兴趣区域.当该值非空只对该区域进行处理
struct_IplImage*maskROI;//在OpenCV中必须置NULL
void*imageId;//同上
struct_IplTileInfo*tileInfo;//同上
intimageSize;//图像数据大小,单位字节
char*imageData;//指向排列的图像数据
intwidthStep;//排列的图像行大小,以字节为单位
intBorderMode[4];intBorderConst[4];//边际结束模式,被忽略
char*imageDataOrigin;//指针指向一个不同的图像数据结构,是为了纠正图像内存分配准备的
}IplImag;
}
3.11
#include
#include
#include
//访问图像中的数据
//将每个点的饱和度和明度设置成255,则我们可以使用指针来遍历图像
voidsaturate_sv(IplImage*img){
for(inty=0;y
uchar*ptr=(uchar*)(
img->imageData+y*img->widthStep
);
for(intx=0;x
ptr[3*x+1]=255;//每一个点都有三个通道
ptr[3*x+2]=255;
}
}
}
intmain(intargc,char**argv)
{
IplImage*img=cvLoadImage(“1.jpg”);
cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);
saturate_sv(img);//调用函数
cvShowImage("Example1",img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("Example1");
}
3.12
#include
#include
//ch3_ex3_12image_namexywidthheightadd#
intmain(intargc,char**argv)
{
//ROI与WidthStep允许对图像的一小部分进行运算,提高执行速率
IplImage*src;
cvNamedWindow("Example3_12_pre",CV_WINDOW_AUTOSIZE);
cvNamedWindow("Example3_12_post",CV_WINDOW_AUTOSIZE);
if(argc==7&&((src=cvLoadImage("1.jpg",1))!
=0))
{
intx=atoi("1");
inty=atoi("2");
intwidth=atoi("3");
intheight=atoi("4");
intadd=atoi("5");
//设置ROI,后面操作只对ROI区域
cvShowImage("Example3_12_pre",src);
cvSetImageROI(src,cvRect(x,y,width,height));
//cvAdd:
两个数组元素分别相加;cvAddS:
数组元素分别与一个标量相加
//cvScalar:
4个double类型元素的数据,常用于初始化通道,存放三通道图像中像素:
cvScalar(255,255,255);
cvAddS(src,cvScalar(add),src);
cvResetImageROI(src);
cvShowImage("Example3_12_post",src);
cvWaitKey();
}
cvReleaseImage(&src);
cvDestroyWindow("Example3_12_pre");
cvDestroyWindow("Example3_12_post");
return0;
}
3.13
#include
#include
//利用其他widthStep方法把interest_img方法的所有像素值加1
intmain(intargc,char**argv)
{
IplImage*interest_img;//初始图像
CvRectinterest_rect;//设置ROI区域
if(argc==7&&((interest_img=cvLoadImage("1.jpg",1))!
=0))
{
interest_rect.x=atoi("1");
interest_rect.y=atoi("2");
interest_rect.width=atoi("3");
interest_rect.height=atoi("4");
intadd=atoi("5");
//设置子图像区域
//创建IplImage图像头,制定图像的尺寸,深度和通道数,不包括数据区域
IplImage*sub_img=cvCreateImageHeader(
cvSize(
interest_rect.width,
interest_rect.height
),
interest_img->depth,
interest_img->nChannels
);
//设置图像显示属性,origin=0表示左上角为原点,=1为左下角
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;
//对ROI区域进行操作,结果反映在原图像上
cvAddS(sub_img,cvScalar(add),sub_img);
cvReleaseImageHeader(&sub_img);
cvNamedWindow("Roi_Add",CV_WINDOW_AUTOSIZE);
cvShowImage("Roi_Add",interest_img);
cvWaitKey();
}
return0;
}
3.14
#include
#include
#include
intmain(intargc,char**argv)
{
IplImage*src1,*src2;
if(argc==9&&((src1=cvLoadImage("1.jpg",1))!
=0
)&&((src2=cvLoadImage(argv[2],1))!
=0))
{
intx=atoi("10");
inty=atoi("10");
intwidth=atoi("10");
intheight=atoi("10");
doublealpha=(double)atof("10");
doublebeta=(double)atof("10");
cvSetImageROI(src1,cvRect(x,y,width,height));
cvSetImageROI(src2,cvRect(0,0,width,height));//设置ROI,后面操作只对ROI区域
cvAddWeighted(src1,alpha,src2,beta,0.0,src1);
cvResetImageROI(src1);//2个源图像、一个目的图像
cvNamedWindow("Alpha_blend",1);
cvShowImage("Alpha_blend",src1);
cvWaitKey();
}
else
printf("Couldn'tloadoneorbothof%s,%s\n",argv[1],argv[2]);
return0;
}
3.15(存储和读取CvMat)
#include
#include
#include
intmain(intargc,char**argv)
{
CvMat*the_matrix_data=cvCreateMat(5,5,CV_32FC1);
floatelement_3_2=7.7;
*((float*)CV_MAT_ELEM_PTR(*the_matrix_data,3,2))=element_3_2;
cvmSet(the_matrix_data,4,4,0.5000);//通常情况下,set与get效率很低,一般定义自己的指针计算并且在矩阵中利用自己的方法。
cvmSet,cvmGet用于处理浮点型单通道矩阵
cvSetReal2D(the_matrix_data,3,3,0.5000);
CvMatA=cvMat(5,5,CV_32F,the_matrix_data);
printf("Example3_15:
\nSavingmy_matrix.xml\n");
cvSave("my_matrix.xml",&A);
prin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- opencv 例子 注释