查询OpenCV中的最大网络摄像头分辨率

时间:2013-08-27 06:29:17

标签: c++ opencv webcam resolution

我正在处理几种类型的相机,我需要知道每种相机的最大分辨率。

有没有办法在OpenCV中查询这样的属性?

如果没有,还有其他办法吗?该应用程序将在Windows下运行(目前),所有项目都是使用C ++开发的。

6 个答案:

答案 0 :(得分:10)

一个对我有用的技巧:

设置为非常高的分辨率(高于任何常用捕获设备的功能),然后获得当前分辨率。 您将看到设备将自动切换到其最大值。

使用OpenCV 3.0的Python中的代码示例:

HIGH_VALUE = 10000
WIDTH = HIGH_VALUE
HEIGHT = HIGH_VALUE

self.__capture = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
self.__capture.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
self.__capture.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)

width = int(self.__capture.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(self.__capture.get(cv2.CAP_PROP_FRAME_HEIGHT))

希望它有所帮助。

答案 1 :(得分:3)

最终解决方案

由于accepted answered user2949634是用Python编写的,我在C ++中发布了等效的实现以实现完整性:

void query_maximum_resolution(cv::VideoCapture* camera, int& max_width, int& max_height)
{
  // Save current resolution
  const int current_width  = static_cast<int>(camera->get(CV_CAP_PROP_FRAME_WIDTH));
  const int current_height = static_cast<int>(camera->get(CV_CAP_PROP_FRAME_HEIGHT));

  // Get maximum resolution
  camera->set(CV_CAP_PROP_FRAME_WIDTH,  10000);
  camera->set(CV_CAP_PROP_FRAME_HEIGHT, 10000);
  max_width  = static_cast<int>(camera->get(CV_CAP_PROP_FRAME_WIDTH));
  max_height = static_cast<int>(camera->get(CV_CAP_PROP_FRAME_HEIGHT));

  // Restore resolution
  camera->set(CV_CAP_PROP_FRAME_WIDTH,  current_width);
  camera->set(CV_CAP_PROP_FRAME_HEIGHT, current_height);
}

答案 2 :(得分:2)

VideoCapture::get(int propId)

传入CV_CAP_PROP_FRAME_WIDTH和CV_CAP_PROP_FRAME_HEIGHT将为您提供解决方案。

要获得最大可能的分辨率,cv::VideoCapture的所有功能都在该链接中。似乎没有一种可能的方法直接这样做,可能是因为许多相机希望您知道手册中的可能分辨率并设置一些标记以切换您想要的内容。您可以尝试的一件事是保留所有常见分辨率的列表,然后在检查返回值的同时为VideoCapture::set的每个摄像头尝试所有这些分辨率以查看它是否成功。搜索的分辨率不是很多,所以这应该是可行的。

答案 3 :(得分:2)

自己搜索同一主题: 如前所述,没有直接属性,但您可以找到支持的分辨率,试图找出接受的相机分辨率:

  1. 尝试所有可能的common resolutions
  2. 探测最小分辨率并增加宽度/高度
  3. 这里是C ++ OpenCV 2.4.8 / Windows测试代码示例

    尝试通用解决方案解决方案:

    const CvSize CommonResolutions[] = {
      cvSize(120, 90),
      cvSize(352, 240),
      cvSize(352, 288),
      // and so on
      cvSize(8192, 4608)
    };
    
    vector<CvSize> getSupportedResolutions(VideoCapture camera)
    {
      vector<CvSize> supportedVideoResolutions;
      int nbTests = sizeof(CommonResolutions) / sizeof(CommonResolutions[0]);
    
      for (int i = 0; i < nbTests; i++) {
        CvSize test = CommonResolutions[i];
    
        // try to set resolution
        camera.set(CV_CAP_PROP_FRAME_WIDTH, test.width);
        camera.set(CV_CAP_PROP_FRAME_HEIGHT, test.height);
    
        double width = camera.get(CV_CAP_PROP_FRAME_WIDTH);
        double height = camera.get(CV_CAP_PROP_FRAME_HEIGHT);
    
        if (test.width == width && test.height == height) {
          supportedVideoResolutions.push_back(test);
        }
      }
    
      return supportedVideoResolutions;
    }
    

    根据宽度增量探测解决方案:

    vector<CvSize> getSupportedResolutionsProbing(VideoCapture camera)
    {
        vector<CvSize> supportedVideoResolutions;
    
        int step = 100;
        double minimumWidth = 16; // Microvision
        double maximumWidth = 1920 + step; // 1080
    
        CvSize currentSize = cvSize(minimumWidth, 1);
        CvSize previousSize = currentSize;
    
        while (1) {
            camera.set(CV_CAP_PROP_FRAME_WIDTH, currentSize.width);
            camera.set(CV_CAP_PROP_FRAME_HEIGHT, currentSize.height);
    
            CvSize cameraResolution = cvSize(
                camera.get(CV_CAP_PROP_FRAME_WIDTH),
                camera.get(CV_CAP_PROP_FRAME_HEIGHT));
    
    
            if (cameraResolution.width == previousSize.width 
                     && cameraResolution.height == previousSize.height)
            {
                supportedVideoResolutions.push_back(cameraResolution);
                currentSize = previousSize = cameraResolution;
            }
            currentSize.width += step;
            if (currentSize.width > maximumWidth)
            {
                break;
            }
        }
    
        return supportedVideoResolutions;
    }
    

    我希望这对未来用户有所帮助。

答案 4 :(得分:1)

如果摄像机为UVC compliant,则可以从USB设备查询此类硬件功能。这取决于设备的驱动程序/固件。例如,请参阅这些Microsoft requirements,以了解您可以在Windows平台上获得哪种支持。

答案 5 :(得分:0)

对于 Ubuntu:安装

sudo apt install v4l-utils

然后,运行:

v4l2-ctl -d /dev/video0 --list-formats-ext