OpenCV图像的使用和操作

来源:互联网 发布:淘宝快递助手怎么授权 编辑:程序博客网 时间:2024/06/05 05:26

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);//把值设置到实际图像中

· 直接方式(访问效率高,易出错)

单通道(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;

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;

· 图像转换灰度->彩色

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//色调 

· 获得帧的当前位置

CV_CAP_PROP_POS_MSEC //视频当时的毫秒数或者视频的时间戳 
CV_CAP_PROP_POS_FRAME//0-based 
CV_CAP_PROP_AVI_RATIO//视频文件的相对位置 

保存视频文件

· 初始化视频写入

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); 

· 视频写入的格式还有

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'); 

· 写入视频文件

IplImage* img=0; 
int nFrames=50; 
for(int i=0;i<nFrames;i++){

cvGrabFrame(capture); 
img=cvRetreveFrame(capture); 
cvWriteFrame(writer,img); 

· 释放视频写入

cvReleaseVideoWriter(&writer);

 

 

0 0
原创粉丝点击