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 这个函数还可以把图像进行垂直方向上的旋转