[OpenCV]获取摄像头视频
环境:Windows 8 64bit + VS2012 X64 + OpenCV 2.4.7
摄像头的捕捉使用VideoCapture类
Class VideoCapture 【OpenCV文档的链接点这里】
这个类专门用来从视频文件或者摄像头中获取视频流
具体的构造和相关方法,参考上面的官方文档
示例代码如下:
1 #include "opencv2/opencv.hpp" 2 3 using namespace cv; 4 5 int main(int, char**) 6 { 7 VideoCapture cap(0); //打开默认的摄像头号 8 if(!cap.isOpened()) //检测是否打开成功 9 return -1; 10 11 Mat edges; 12 namedWindow("edges",1); 13 for(;;) 14 { 15 Mat frame; 16 cap >> frame; // 从摄像头中获取新的一帧 17 cvtColor(frame, edges, CV_BGR2GRAY); 18 GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 19 Canny(edges, edges, 0, 30, 3); 20 imshow("edges", edges); 21 if(waitKey(30) >= 0) break; 22 } 23 //摄像头会在VideoCapture的析构函数中释放 24 return 0; 25 }
Get和Set方法的参数如下
C++: bool VideoCapture::set(int propId, double value) 和 double VideoCapture::get(int propId)
参数propId如下: 来自这里
CV_CAP_PROP_POS_MSEC 视频当前点的毫秒值或视频捕捉的时间戳
CV_CAP_PROP_POS_FRAMES 下次将被捕获的0基索引的帧
CV_CAP_PROP_POS_AVI_RATIO 视频文件的相关位置: 0 - start of the film, 1 - end of the film.
CV_CAP_PROP_FRAME_WIDTH 视频流帧的宽度
CV_CAP_PROP_FRAME_HEIGHT 视频流帧的高.
CV_CAP_PROP_FPS 帧率.
CV_CAP_PROP_FOURCC 4字符编码的编码器.
CV_CAP_PROP_FRAME_COUNT 视频文件的帧数.
CV_CAP_PROP_FORMAT 由retrieve()返回矩阵对象的格式 .
CV_CAP_PROP_MODE 后端指定值指示当前捕捉的模式.
CV_CAP_PROP_BRIGHTNESS 图像亮度 (只对摄像头).
CV_CAP_PROP_CONTRAST 图像对比度 (only for cameras).
CV_CAP_PROP_SATURATION 图像饱和度 (only for cameras).
CV_CAP_PROP_HUE 色调 (only for cameras).
CV_CAP_PROP_GAIN 增益(only for cameras).
CV_CAP_PROP_EXPOSURE 曝光(only for cameras).
CV_CAP_PROP_CONVERT_RGB 布尔型标记图像是否应该被转换为RGB.
CV_CAP_PROP_WHITE_BALANCE 白平衡(目前不支持)
CV_CAP_PROP_RECTIFICATION 立体相机的矫正标记(note: only supported by DC1394 v 2.x backend currently)
在使用示例代码的时候出现了个问题,在cap>>frame这里,获取出现frame为空,但也有可以正常运行的。表示对底层的机制不了解,先拿来跑起来好了。
在stackoverflow上有人也问了这个问题,请点击这里
有人说的原因是在VideoCapture刚开始获取摄像头视频流的过程不返回信号,所以判断Mat是否为空,并不断循环去获取Mat
把waitKey当做延时函数来更新窗口中获取的图像
1 int cameraNumber = 0; 2 3 VideoCapture camera; 4 camera.open(cameraNumber); 5 if ( !camera.isOpened() ) { 6 cerr << "ERROR: Could not access the camera or video!" << endl; 7 exit(1); 8 } 9 10 int CAMERA_CHECK_ITERATIONS = 10; 11 while (true) { 12 Mat cameraFrame; 13 camera >> cameraFrame; 14 if ( !cameraFrame.empty() ) { 15 imshow("Video", cameraFrame); 16 int key = waitKey(1); 17 if ( key == 27 ) break; 18 } else { 19 cout << "::: Accessing camera :::" << endl; 20 if ( CAMERA_CHECK_ITERATIONS > 0 ) CAMERA_CHECK_ITERATIONS--; 21 else break; 22 } 23 }
作者:
Tiny656
出处:http://www.cnblogs.com/tiny656
欢迎交流讨论. 236798656 [at] qq.com