【问题标题】:Query maximum webcam resolution in OpenCV在 OpenCV 中查询最大网络摄像头分辨率
【发布时间】:2013-08-27 06:29:16
【问题描述】:

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

有没有办法在 OpenCV 中查询此类属性?

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

【问题讨论】:

  • 我指的当然是 OpenCV 支持的相机。 PGR 等相机使用自己的 SDK 进行查询。

标签: c++ opencv webcam resolution


【解决方案1】:

对我有用的技巧:

只需设置一个非常高的分辨率(高于任何常用捕获设备的功能),然后获取当前分辨率。 你会看到设备会自动切换到他的最大值。

使用 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))

希望对你有帮助。

【讨论】:

  • 工作得很好,至少在我可以访问的网络摄像头上。感谢和抱歉迟到的答案。
  • 宽度和高度设置的顺序对我来说很重要。当我设置高度后跟宽度时,分辨率设置为 800x640。当我设置宽度后跟高度时,分辨率为 1024x768。
【解决方案2】:

最终解决方案

由于 user2949634accepted answered 是用 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);
}

【讨论】:

  • 宽度和高度设置的顺序对我来说很重要。当我设置高度后跟宽度时,分辨率设置为 800x640。当我设置宽度后跟高度时,分辨率为 1024x768。
【解决方案3】:

VideoCapture::get(int propId)

传入 CV_CAP_PROP_FRAME_WIDTH 和 CV_CAP_PROP_FRAME_HEIGHT 将为您提供分辨率。

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

【讨论】:

  • 谢谢。这是迄今为止我发现使用 OpenCV 的唯一方法。有没有其他方法可以确定?也许使用 DShow?
  • 我不确定 DShow,但它似乎很有希望。另外,如果您知道协议,那么也许。例如对于 IEEE 1394(火线),请查看 libdc1394 structures。 OpenCV 使用它作为 IEEE1394 相机的后端。不过,我会先看看 DShow,可能会问另一个针对 DShow 用户的问题。
【解决方案4】:

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

  1. 尽一切可能common resolutions
  2. 探测最小分辨率并增加宽度/高度

这里是 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;
}

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

【讨论】:

  • 长但有用。 +1 表示为此付出的努力。
【解决方案5】:

对于 Ubuntu:安装

sudo apt install v4l-utils

然后,运行:

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

【讨论】:

    【解决方案6】:

    如果摄像头为UVC compliant,则可以从USB设备中查询到这种硬件能力。这取决于设备的驱动程序/固件。例如,请参阅这些Microsoft requirements,以猜测您可以在 Windows 平台上获得什么样的支持。

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      相关资源
      最近更新 更多