Запрос максимального разрешения веб-камеры в OpenCV

Я имею дело с несколькими типами камер, и мне нужно знать максимальное разрешение каждого из них.

Есть ли способ запросить такое свойство в OpenCV?

Если нет, есть ли другой способ? Приложение будет работать под Windows (на данный момент), и весь проект разрабатывается с использованием C ++.

1

Решение

Уловка, которая работает для меня:

Просто установите очень высокое разрешение (выше возможностей любого обычного устройства захвата), а затем получите текущее разрешение.
Вы увидите, что устройство автоматически переключится на его максимальное значение.

Пример кода в Python с OpenCV 3.0:

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

Надеюсь, поможет.

9

Другие решения

ОКОНЧАТЕЛЬНОЕ РЕШЕНИЕ

Как принял ответ от 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);
}
3

VideoCapture :: get (int propId)

Передав CV_CAP_PROP_FRAME_WIDTH и CV_CAP_PROP_FRAME_HEIGHT, вы получите разрешение.

Для получения максимума возможный разрешение, все функции для cv::VideoCapture в этой ссылке. Похоже, что нет прямого способа сделать это напрямую, возможно, потому что многие камеры ожидают, что вы узнаете возможные разрешения из руководства и установите некоторые флаги для переключения того, что вы хотите. Одна вещь, которую вы можете попробовать, это сохранить список всех распространенных разрешений, а затем попробовать их все для каждой камеры с VideoCapture::set проверяя возвращаемое значение, чтобы увидеть, было ли оно успешным. Есть не так много разрешений для поиска, поэтому это должно быть жизнеспособным.

2

Сам ищу по той же теме:
Как было сказано ранее, прямого свойства нет, но вы можете найти поддерживаемые разрешения, пытаясь определить допустимые разрешения камеры:

  1. пытаясь все возможное общие решения
  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;
}

Я надеюсь, что это будет полезно для будущих пользователей.

2

Этот вид аппаратных возможностей можно запрашивать с USB-устройств, если камера UVC-совместимый. Это зависит от драйвера / прошивки устройства. Смотрите, например, эти Требования Microsoft угадать, какую поддержку вы можете ожидать на платформах Windows.

1
По вопросам рекламы [email protected]