opencv 学习第四天 学习opencv(中文版) 总结一下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);

翻转图像

#include <iostream>
#include <cv.h>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
void main()
{
	IplImage *img1;
	img1 = cvLoadImage("d:\\2.png");
	cvNamedWindow("example",CV_WINDOW_AUTOSIZE);
	cvShowImage("example",img1);
	cvFlip(img1);
	cvNamedWindow("example1",CV_WINDOW_AUTOSIZE);
	cvShowImage("example1",img1);
	waitKey(0);
	system("pause");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值