我是靠谱客的博主 清脆香水,最近开发中收集的这篇文章主要介绍OpenCV 图像使用和操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

原文地址: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);//把值设置到实际图像中
  • 直接方式(访问效率高,易出错)
    • 单通道(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);

最后

以上就是清脆香水为你收集整理的OpenCV 图像使用和操作的全部内容,希望文章能够帮你解决OpenCV 图像使用和操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部