概述
原文地址:http://lubobill1990.blog.163.com/blog/static/36930386201010653632341/
IplImage* cvCreateImage(CvSize size,int depth,int channels);
创建一幅图像
IplImage* cvCloneImage(IplImage*);
复制一幅图像
void cvRealeaseImage(IplImage**);
释放一幅图像
设置或得到感兴趣区域ROI
void cvSetImageROI(IplImage* image,CvRect rect);
void cvResetImageROI(IplImage* image);
CvRect cvGetImageROI(const IplImage* image);
设置和得到感兴趣通道的COI
void cvSetImageCOI(IplImage* image,int coi);
int cvGetImageCOI(const IplImage* image);
图像的读写
IplImage* cvLoadImage(fileName,int flag); flag>0,载入图像强制为3通道彩色图像 flag=0,载入图像强制为单通道灰度图像 flag<0,载入图像由文件中的通道数决定
int cvSaveImage(fileName,const CvArr* img); 保存图像的格式由fileName的后缀名决定 如果保存成功返回非零数
访问图像元素(访问图像第k通道,第i行,第j列的像素值,k[0,通道总数-1],i[0,height-1],j[0,width-1])
- 间接方式(常用,可访问任意类型图像,访问效率不高)
- CvScalar s=cvGet2D(img,i,j);//获取值,CvScalar是一struct,里面只有一个double类型的val大小为4的数组
- s.val[0]=111;//0位置表示G通道,1位置表示R通道,2位置表示B通道, cvSet2D(img,i,j,s);//把值设置到实际图像中
- CvScalar s=cvGet2D(img,i,j);//获取值,CvScalar是一struct,里面只有一个double类型的val大小为4的数组
- 直接方式(访问效率高,易出错)
- 单通道(cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);)
- 直接获得或者修改((uchar*)(img->imageData+i*img->widthStep))[j]
- 多通道(cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);)
- 直接获得或者修改((uchar*)(img->imageData+i*img->widthStep))[j*img->nChannels+0]//B
- 直接获得或者修改((uchar*)(img->imageData+i*img->widthStep))[j*img->nChannels+1]//G
- 直接获得或者修改((uchar*)(img->imageData+i*img->widthStep))[j*img->nChannels+2]//R
- 多通道浮点数(cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);)
- 直接获得或者修改((float*)(img->imageData+i*img->widthStep))[j*img->nChannels+0]//B
- 直接获得或者修改((float*)(img->imageData+i*img->widthStep))[j*img->nChannels+1]//G
- 直接获得或者修改((float*)(img->imageData+i*img->widthStep))[j*img->nChannels+2]//R
- 用指针直接访问(简单高效)
- 单通道单字节(cvCreateImage(cvSize(640,480),IPL_DEPTH8U,1);)
- int step=img->widthStep/sizeof(uchar);
- uchar* data=(uchar*)img->imageData;
- data[i*step+j]=111;
- 多通道单字节(cvCreateImage(cvSize(640,480),IPL_DEPTH8U,3);)
- int step=img->widthStep/sizeof(uchar);
- int channels=img->nChannels;
- uchar* data=(uchar*)img->imageData;
- data[i*step+j*channels+k]=111;
- 多通道浮点数(cvCreateImage(cvSize(640,480),IPL_DEPTH32F,3);)
- int step=img->widthStep/sizeof(float);
- int channels=img->nChannels;
- float* data=(float*)img->imageData;
- data[i*step+j*channels+k]=111;
- 单通道单字节(cvCreateImage(cvSize(640,480),IPL_DEPTH8U,1);)
- c++外壳直接访问(简单高效)
- 单通道单字节
- BwImage imgA(img);
- imgA[i][j]=111;
- 多通道单字节
- RgbImage imgB(img);
- imgB[i][j].b=111;
- imgB[i][j].g=111;
- imgB[i][j].r=111;
- 多通道浮点
- RgbImageFloat imgC(img);
- imgC[i][j].b=111;
- imgC[i][j].g=111;
- imgC[i][j].r=111;
- 单通道单字节
- 单通道(cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);)
- 灰度->彩色
- cvConvertImage(src,dst,flags);
- 彩色->灰度
- 彩色空间转换
- 矩形
- cvRectangle(img,cvPoint(100,100),cvPoint(200,200),cvScalar(255,0,0),1);
- 圆
- cvCircle(img,cvPoint(100,100),90,cvScalar(200,200,42),,7);
- 线段
- cvLine(img,cvPoint(100,100),cvPoint(300,400),cvScalar(32,135,56),12);
- 多边形
- CvPoint p1[]={10,10, 10,100, 100,100, 100,10};
- CvPoint p2[]={30,30, 30,130, 130,130, 150,10};
- CvPoint* pointArr[2]={p1,p2};
- int nCurvePts[2]={4,5};
- int nCurves=2;
- int isCurveClosed=1;
- int lineWidth=1;
- cvPolyLine(img,pointArr,nCurvePts,nCurves,cvScalar(0,0,255));
- 填充多边形
- cvFillPoly(img,pointArr,nCurvePts,nCurves,cvScalar(0,0,255));
- 写字
- CvFont font;
- double hScale=1.0;
- double vScale=1.0;
- int lineWidth=1;
- cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC,hScale,vScale,0,lineWidth);
- cvPutText(img,"Hello World",cvPoint(200,400),&font,cvScalar(255,255,0));
- 字体
- CV_FONT_HERSHEY_SIMPLEX - normal size sans-serif font
- CV_FONT_HERSHEY_PLAIN - small size sans-serif font
- CV_FONT_HERSHEY_DUPLEX - normal size sans-serif font (more complex than CV_FONT_HERSHEY_SIMPLEX)
- CV_FONT_HERSHEY_COMPLEX - normal size serif font
- CV_FONT_HERSHEY_TRIPLEX - normal size serif font (more complex than CV_FONT_HERSHEY_COMPLEX)
- CV_FONT_HERSHEY_COMPLEX_SMALL - smaller version of CV_FONT_HERSHEY_COMPLEX
- CV_FONT_HERSHEY_SCRIPT_SIMPLEX - hand-writing style font
- CV_FONT_HERSHEY_SCRIPT_COMPLEX - more complex variant of CV_FONT_HERSHEY_SCRIPT_SIMPLEX
- 对摄像头初始化捕捉
- CvCapture* capture=cvCaptureFromCAM(0);//从摄像头0捕捉
- 对文件初始化捕捉
- CvCapture* capture=cvCaptureFromAVI("/home/lubo/....avi");//从文件捕捉
- 捕捉某一帧
- IplImage* img=0;
- 方法一
- if(!cvGrabFrame(capture)){ //捕获失败 exit(0); }
- img=cvRetrieveFrame(capture);
- 方法二
- img=cvQueryFrame(capture);
- 如果同时从几个摄像头捕捉,应该先从每一个摄像头抓取图像,抓取结束后再捕捉图像
- 释放捕捉源(图像是由捕捉函数分配和释放的,所以不要释放图像)
- cvReleaseCapture(&capture);
- 获得捕捉装置的属性
-
cvQueryFrame(capture);
int frameH=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);//视频的高
CV_CAP_PROP_FRAME_WIDTH//视频的宽
CV_CAP_PROP_FPS //每秒帧数
CV_CAP_PROP_FRAME_COUNT//帧数
CV_CAP_PROP_FOURCC //4-character code of codec
CV_CAP_PROP_BRIGHTNESS//亮度
CV_CAP_PROP_CONTRAST//对比度
CV_CAP_PROP_SATURATION//饱和度
CV_CAP_PROP_HUE//色调
-
cvQueryFrame(capture);
- 获得帧的当前位置
-
CV_CAP_PROP_POS_MSEC //视频当时的毫秒数或者视频的时间戳
CV_CAP_PROP_POS_FRAME//0-based
CV_CAP_PROP_AVI_RATIO//视频文件的相对位置
-
CV_CAP_PROP_POS_MSEC //视频当时的毫秒数或者视频的时间戳
保存视频文件
- 初始化视频写入
-
CvCideoWriter* writer=0;
int isColor=1;
int fps=25;//30
int frameW=640;
int frameH=480;
writer=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'),fps,cvSize(frameW,frameH),isColor);
-
CvCideoWriter* writer=0;
- 视频写入的格式还有
-
CV_FOURCC('M','J','P','G');
CV_FOURCC('M','P','4','2');
CV_FOURCC('D','I','V','3');
CV_FOURCC('D','I','V','X');
CV_FOURCC('U','2','6','3');
CV_FOURCC('I','2','6','3');
CV_FOURCC('F','L','V','1');
-
CV_FOURCC('M','J','P','G');
- 写入视频文件
-
IplImage* img=0;
int nFrames=50;
for(int i=0;i<nFrames;i++){-
cvGrabFrame(capture);
img=cvRetreveFrame(capture);
cvWriteFrame(writer,img);
-
cvGrabFrame(capture);
-
IplImage* img=0;
- 释放视频写入
- cvReleaseVideoWriter(&writer);
最后
以上就是清脆香水为你收集整理的OpenCV 图像使用和操作的全部内容,希望文章能够帮你解决OpenCV 图像使用和操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复