zoukankan      html  css  js  c++  java
  • [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     }
  • 相关阅读:
    个人作业——软件评测
    2020软件工程实践 作业3
    2020软件工程实践 寒假作业2
    2020软件工程实践 寒假作业1
    计网大概
    大写金额转换实现
    软件工程实践总结&个人技术博客
    个人技术博客
    软件评测
    疫情统计实现
  • 原文地址:https://www.cnblogs.com/tiny656/p/3538115.html
Copyright © 2011-2022 走看看