opencv视频处理整理

opencv 的highgui仓库里可以处理三大部分内容:摄像机等硬件,文件系统,用户界面。

这里先整理下常见的摄像头库函数:

CVvCapture *cvCreateFileCapture(const char* "文件名"):返回一个CvCapture指针,如果读入成功,返回一个已经初始化的CvCapture指针,失败返回NULL;

使用它是要检查返回值是否为空;

CVvCapture *cvCreateCameraCapture(int index);只有一个摄像头;index表示打开那个摄像头,但也有另外一些含义:


和以上值相加,表示摄像头的类型;


下面介绍读取视频的函数:

int cvGrabFrame(cvCapture *capture) :抓取一帧视频把他放到不可见的内存,这一帧视频是未经过处理的,不能直接显示;成功返回1,否则0;

IplImage *cvRetraveFrame((cvCapture *capture);对这帧视频进行处理,然后放到一个指针里;

IplImage *cvQueryFrame((cvCapture *capture);:前面两个函数的组合;

释放cvCapture结构:

void cvReleaseCapture(cvCapture *capture);

得到视频的信息:

double cvGetCaptureProperty(cvCapture *capture,int property_id)

property_id:

#define CV_CAP_PROP_POS_MSEC       0
#define CV_CAP_PROP_POS_FRAMES     1
#define CV_CAP_PROP_POS_AVI_RATIO  2
#define CV_CAP_PROP_FRAME_WIDTH    3
#define CV_CAP_PROP_FRAME_HEIGHT   4
#define CV_CAP_PROP_FPS            5
#define CV_CAP_PROP_FOURCC         6
#define CV_CAP_PROP_FRAME_COUNT    7
#define CV_CAP_PROP_FORMAT         8
#define CV_CAP_PROP_MODE           9
#define CV_CAP_PROP_BRIGHTNESS    10
#define CV_CAP_PROP_CONTRAST      11
#define CV_CAP_PROP_SATURATION    12
#define CV_CAP_PROP_HUE           13
#define CV_CAP_PROP_GAIN          14
#define CV_CAP_PROP_EXPOSURE      15
#define CV_CAP_PROP_CONVERT_RGB   16
#define CV_CAP_PROP_WHITE_BALANCE 17
#define CV_CAP_PROP_RECTIFICATION 18

 以上有些参数是不可靠的,如CV_CAP_PROP_FRAME_COUNT ,有的说要先读取一帧,但好像也没效果;

例子:一般通过返回值可以得到视频信息,但是视频格式要进行转换

double f=cvGetCaptureProperty(capture,CV_CAP_PROP_FOURCC)

char * fourcc=(char*)(&f);//得到视频格式;

通过创建一个Capture对象的指针后,调用cvGetCaptureProperty即可获取上述任何相关属性;但是我们不能太依赖这个函数;比如我们想获取一段视频的帧数,我们就不能太依赖于CV_CAP_PROP_FRAME_COUNT这个属性;因为cvGetCaptureProperty对属性的访问,其实访问的是关联视频文件的文件头信息,并不是真正去访问了视频的图像数据,这就带来一个问题:我们在讲其他视频格式转换为AVI格式的时候,图像帧数并没改变,只是视频文件头改变了,这时直接通过get函数读取的信息就可能不准确;最好的办法是迭代从视频中取出一帧,检查是否有数据,来确定该视频文件的总共帧数~~~


设置视频属性:

cvSetCaptureProperty(cvCapture *capture,int property_id,double value)

这个可以设置上面的参数的值,但有的参数是不能设置的,如CV_CAP_PROP_FOURCC就不能设置;


写视频:

1创建写视频的结构:可以认为是内存与硬盘的中建结构:CvVideoWrite *cvCreateVideoWrite(const char *"文件名",int "格式",double 帧率,CvSize "大小",int 颜色(默认彩色);

2,写视频:cvWriteFrame(CvVideoWrite* write ,IplImage *frame);

3,释放视频结构:cvReleaseVideoWrite(CvVideoWrite* *write);


highgui里的另外一个重要函数:孤立的函数cvConvertImage(const cvarr *src, cvarr* dst ,int flag)

把不同格式,通道的图或者矩阵转化;设置flag 这个函数还可以把图像进行垂直方向上的旋转









你可能感兴趣的:(opencv,highgui,视频读写)