OpenCV图像的使用和操作
2014-07-10 20:47
302 查看
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])
· 间接方式(常用,可访问任意类型图像,访问效率不高)
o 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);//把值设置到实际图像中
· 直接方式(访问效率高,易出错)
o 单通道(cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);)
§ 直接获得或者修改((uchar*)(img->imageData+i*img->widthStep))[j]
o 多通道(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
o 多通道浮点数(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
o 用指针直接访问(简单高效)
§ 单通道单字节(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;
o c++外壳直接访问(简单高效)
§ 单通道单字节
§ BwImage imgA(img);
<
4000
span style="font-size:18px;">§ 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;
· 图像转换灰度->彩色
o cvConvertImage(src,dst,flags);
· 彩色->灰度
· 彩色空间转换
· 绘制命令矩形
o cvRectangle(img,cvPoint(100,100),cvPoint(200,200),cvScalar(255,0,0),1);
· 圆
o cvCircle(img,cvPoint(100,100),90,cvScalar(200,200,42),,7);
· 线段
o cvLine(img,cvPoint(100,100),cvPoint(300,400),cvScalar(32,135,56),12);
· 多边形
o CvPoint p1[]={10,10, 10,100, 100,100, 100,10};
o CvPoint p2[]={30,30, 30,130, 130,130, 150,10};
o CvPoint* pointArr[2]={p1,p2};
o int nCurvePts[2]={4,5};
o int nCurves=2;
o int isCurveClosed=1;
o int lineWidth=1;
o cvPolyLine(img,pointArr,nCurvePts,nCurves,cvScalar(0,0,255));
· 填充多边形
o cvFillPoly(img,pointArr,nCurvePts,nCurves,cvScalar(0,0,255));
· 写字
o CvFont font;
o double hScale=1.0;
o double vScale=1.0;
o int lineWidth=1;
o cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC,hScale,vScale,0,lineWidth);
o cvPutText(img,"Hello World",cvPoint(200,400),&font,cvScalar(255,255,0));
o 字体
§ 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
· 视频的使用和操作对摄像头初始化捕捉
o CvCapture* capture=cvCaptureFromCAM(0);//从摄像头0捕捉
· 对文件初始化捕捉
o CvCapture* capture=cvCaptureFromAVI("/home/lubo/....avi");//从文件捕捉
· 捕捉某一帧
o IplImage* img=0;
o 方法一
§ if(!cvGrabFrame(capture)){ //捕获失败 exit(0); }
§ img=cvRetrieveFrame(capture);
o 方法二
§ img=cvQueryFrame(capture);
o 如果同时从几个摄像头捕捉,应该先从每一个摄像头抓取图像,抓取结束后再捕捉图像
· 释放捕捉源(图像是由捕捉函数分配和释放的,所以不要释放图像)
o 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);
}
· 释放视频写入
o cvReleaseVideoWriter(&writer);
创建一幅图像
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])
· 间接方式(常用,可访问任意类型图像,访问效率不高)
o 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);//把值设置到实际图像中
· 直接方式(访问效率高,易出错)
o 单通道(cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);)
§ 直接获得或者修改((uchar*)(img->imageData+i*img->widthStep))[j]
o 多通道(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
o 多通道浮点数(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
o 用指针直接访问(简单高效)
§ 单通道单字节(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;
o c++外壳直接访问(简单高效)
§ 单通道单字节
§ BwImage imgA(img);
<
4000
span style="font-size:18px;">§ 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;
· 图像转换灰度->彩色
o cvConvertImage(src,dst,flags);
· 彩色->灰度
· 彩色空间转换
· 绘制命令矩形
o cvRectangle(img,cvPoint(100,100),cvPoint(200,200),cvScalar(255,0,0),1);
· 圆
o cvCircle(img,cvPoint(100,100),90,cvScalar(200,200,42),,7);
· 线段
o cvLine(img,cvPoint(100,100),cvPoint(300,400),cvScalar(32,135,56),12);
· 多边形
o CvPoint p1[]={10,10, 10,100, 100,100, 100,10};
o CvPoint p2[]={30,30, 30,130, 130,130, 150,10};
o CvPoint* pointArr[2]={p1,p2};
o int nCurvePts[2]={4,5};
o int nCurves=2;
o int isCurveClosed=1;
o int lineWidth=1;
o cvPolyLine(img,pointArr,nCurvePts,nCurves,cvScalar(0,0,255));
· 填充多边形
o cvFillPoly(img,pointArr,nCurvePts,nCurves,cvScalar(0,0,255));
· 写字
o CvFont font;
o double hScale=1.0;
o double vScale=1.0;
o int lineWidth=1;
o cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC,hScale,vScale,0,lineWidth);
o cvPutText(img,"Hello World",cvPoint(200,400),&font,cvScalar(255,255,0));
o 字体
§ 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
· 视频的使用和操作对摄像头初始化捕捉
o CvCapture* capture=cvCaptureFromCAM(0);//从摄像头0捕捉
· 对文件初始化捕捉
o CvCapture* capture=cvCaptureFromAVI("/home/lubo/....avi");//从文件捕捉
· 捕捉某一帧
o IplImage* img=0;
o 方法一
§ if(!cvGrabFrame(capture)){ //捕获失败 exit(0); }
§ img=cvRetrieveFrame(capture);
o 方法二
§ img=cvQueryFrame(capture);
o 如果同时从几个摄像头捕捉,应该先从每一个摄像头抓取图像,抓取结束后再捕捉图像
· 释放捕捉源(图像是由捕捉函数分配和释放的,所以不要释放图像)
o 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);
}
· 释放视频写入
o cvReleaseVideoWriter(&writer);
相关文章推荐
- Python下使用OpenCV——图像的基本操作
- OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))
- 使用OpenCV读、操作、写图像并与bash合作对某个目录下所有图像进行类似处理
- 八.使用OpenCv图像平滑操作
- 使用OpenCv获取摄像头图像并进行旋转操作
- Opencv学习笔记(三):图像的使用与操作_颜色空间的变换
- OpenCV 图像使用和操作
- 五.使用OpenCv操作图像上每一个像素点
- 八.使用OpenCv对图像进行平滑操作
- iOS中使用opencv进行图像识别操作(一)步骤很多,这一篇只是讲了第一步.
- 使用OpenCV读、操作、写图像并与bash合作对某个目录下所有图像进行类似处理
- opencv2中使用Mat对图像像素进行操作
- 图像的像素点操作【OpenCV学习笔记3】
- 使用JavaCV/OpenCV抓取并存储摄像头图像
- OpenCV 编程简介(矩阵/图像/视频的基本读写操作)
- 学习opencv 使用反向块投影搜寻图像中的物体的位置 cvCalcBackProjectPatch
- 学习opencv第六章习题5 , 使用x,y阶层数求出图像内唯一直线的角度
- OpenCV使用简单举例-图像显示
- openCV 矩阵(图像)操作函数
- (转载)opencv 使用DirectShow采集图像