无法使用罗技 C920 访问 cv::视频捕获的属性

Can't access properties of cv::VideoCapture with Logitech C920

本文关键字:视频 属性 cv 访问 罗技 C920      更新时间:2023-10-16

我正在使用罗技C920和OpenCV开发一个小型网络摄像头应用程序。

我实际上可以从相机获得图像没有任何问题给定的分辨率。但是除了帧宽和帧高之外,我无法访问相机中的任何设置。我有以下代码。可以猜到,除了前两行,代码生成的都是零行。

我做错了什么吗?或者这是罗技的另一个专利胡扯?如果这是OpenCV的限制,有没有其他的选择来开发一个应用程序,这个网络摄像头在Windows操作系统?

    m_cam.open(0);
    if(!m_cam.isOpened() )  // check if we succeeded
    {
        std::cerr << "ERROR: Could not open cameras." << std::endl;
        return;
    }
    int ex = static_cast<int>(m_cam.get(CV_CAP_PROP_FOURCC));
    char EXT[] = {ex & 0XFF , (ex & 0XFF00) >> 8,(ex & 0XFF0000) >> 16,(ex & 0XFF000000) >> 24, 0};
    m_cam.set(CV_CAP_PROP_FOURCC,CV_FOURCC('H','2','6','4')); 
    m_cam.set(CV_CAP_PROP_FRAME_WIDTH,1280);//2304);//1829//1200//800
    m_cam.set(CV_CAP_PROP_FRAME_HEIGHT,720);//1536); //1080//800//600   
    m_cam.set(CV_CAP_PROP_FPS, 30);
    //m_cam.set(CV_CAP_PROP_EXPOSURE,0);
    std::cout<< m_cam.get(CV_CAP_PROP_FRAME_WIDTH) << std::endl; 
    std::cout<< m_cam.get(CV_CAP_PROP_FRAME_HEIGHT) << std::endl; 
    std::cout<< m_cam.get(CV_CAP_PROP_FPS) << std::endl; 
    std::cout<< m_cam.get(CV_CAP_PROP_EXPOSURE) << std::endl; 
    std::cout<< m_cam.get(CV_CAP_PROP_FORMAT) << std::endl; 
    std::cout<< m_cam.get(CV_CAP_PROP_CONTRAST) << std::endl; 
    std::cout<< m_cam.get(CV_CAP_PROP_BRIGHTNESS) << std::endl; 
    std::cout<< m_cam.get(CV_CAP_PROP_SATURATION) << std::endl; 
    std::cout<< m_cam.get(CV_CAP_PROP_HUE) << std::endl; 
    std::cout<< m_cam.get(CV_CAP_PROP_POS_FRAMES) << std::endl; 

修复了安装dshow和ffmpeg后重建OpenCV的问题。我现在甚至可以设置一些值,比如帧率,但相机的工作似乎是一个单独的问题。在我的例子中,在设置分辨率而不设置帧速率后,相机分辨率变为640 x 480。虽然我的计算机安装了H264解码器,但1920 x 1080使用OpenCV产生5-7 fps。

在这篇文章中是一个示例代码如何访问您的相机在30fps全高清

编辑:

详细说明一下:

我也有罗技c920, OpenCV 2.4.3, Windows 7 64bi。这是我可以用下面的代码读取的东西(宽度和高度是默认的640*480我认为)。

CV_CAP_PROP_FRAME_WIDTH 1920
CV_CAP_PROP_FRAME_HEIGHT 1080
CV_CAP_PROP_FPS 0
CV_CAP_PROP_EXPOSURE -5
CV_CAP_PROP_FORMAT -1
CV_CAP_PROP_CONTRAST 128
CV_CAP_PROP_BRIGHTNESS 128
CV_CAP_PROP_SATURATION 128
CV_CAP_PROP_HUE -8.58993e+008
CV_CAP_PROP_POS_FRAMES -1
CV_CAP_PROP_FOURCC -4.66163e+008
Input codec type: }Ù6õ //Obviously wrong

我使用的代码:

#include <iostream> // for standard I/O
#include <string>   // for strings
#include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat)
#include <opencv2/highgui/highgui.hpp>  // Video write
#include "opencv2/opencv.hpp"
using namespace cv; using namespace std;
void getCameraInfo(VideoCapture m_cam){
    std::cout<<"CV_CAP_PROP_FRAME_WIDTH " << m_cam.get(CV_CAP_PROP_FRAME_WIDTH) << std::endl; 
    std::cout<<"CV_CAP_PROP_FRAME_HEIGHT " << m_cam.get(CV_CAP_PROP_FRAME_HEIGHT) << std::endl; 
    std::cout<<"CV_CAP_PROP_FPS " << m_cam.get(CV_CAP_PROP_FPS) << std::endl; 
    std::cout<<"CV_CAP_PROP_EXPOSURE " << m_cam.get(CV_CAP_PROP_EXPOSURE) << std::endl; 
    std::cout<<"CV_CAP_PROP_FORMAT " << m_cam.get(CV_CAP_PROP_FORMAT) << std::endl; //deafult CV_8UC3?!
    std::cout<<"CV_CAP_PROP_CONTRAST " << m_cam.get(CV_CAP_PROP_CONTRAST) << std::endl; 
    std::cout<<"CV_CAP_PROP_BRIGHTNESS "<< m_cam.get(CV_CAP_PROP_BRIGHTNESS) << std::endl; 
    std::cout<<"CV_CAP_PROP_SATURATION "<< m_cam.get(CV_CAP_PROP_SATURATION) << std::endl; 
    std::cout<<"CV_CAP_PROP_HUE "<< m_cam.get(CV_CAP_PROP_HUE) << std::endl; 
    std::cout<<"CV_CAP_PROP_POS_FRAMES "<< m_cam.get(CV_CAP_PROP_POS_FRAMES) << std::endl; 
    std::cout<<"CV_CAP_PROP_FOURCC "<< m_cam.get(CV_CAP_PROP_FOURCC) << std::endl; 
    int ex = static_cast<int>(m_cam.get(CV_CAP_PROP_FOURCC));     // Get Codec Type- Int form
    char EXT[] = {(char)(ex & 255) , (char)((ex & 0XFF00) >> 8),(char)((ex & 0XFF0000) >> 16),(char)((ex & 0XFF000000) >> 24), 0};
    cout << "Input codec type: " << EXT << endl;
}
int main(int, char**){
    string resVideoPath = "C:\yourPath\video.avi";
    VideoCapture vidSource;
    double fps=10;
    vidSource = VideoCapture(0); // open the default camera
    vidSource.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
    vidSource.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
    if(!vidSource.isOpened()){
        cout  << "Could not open the input video to read"<< endl;
        return -1;
    }
    getCameraInfo(vidSource);
    namedWindow("Capture", CV_WINDOW_AUTOSIZE);
    while(true){
        Mat frame;
        vidSource >> frame;
        if(!frame.data){
            cerr << "Could not retrieve frame.";
            return -1;}
        imshow("Capture", frame);
        if(waitKey(1) == 27)
            break;
    }
    return 0;
}