Я имею дело с несколькими типами камер, и мне нужно знать максимальное разрешение каждого из них.
Есть ли способ запросить такое свойство в OpenCV?
Если нет, есть ли другой способ? Приложение будет работать под Windows (на данный момент), и весь проект разрабатывается с использованием C ++.
Уловка, которая работает для меня:
Просто установите очень высокое разрешение (выше возможностей любого обычного устройства захвата), а затем получите текущее разрешение.
Вы увидите, что устройство автоматически переключится на его максимальное значение.
Пример кода в 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))
Надеюсь, поможет.
ОКОНЧАТЕЛЬНОЕ РЕШЕНИЕ
Как принял ответ от 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);
}
VideoCapture :: get (int propId)
Передав CV_CAP_PROP_FRAME_WIDTH и CV_CAP_PROP_FRAME_HEIGHT, вы получите разрешение.
Для получения максимума возможный разрешение, все функции для cv::VideoCapture
в этой ссылке. Похоже, что нет прямого способа сделать это напрямую, возможно, потому что многие камеры ожидают, что вы узнаете возможные разрешения из руководства и установите некоторые флаги для переключения того, что вы хотите. Одна вещь, которую вы можете попробовать, это сохранить список всех распространенных разрешений, а затем попробовать их все для каждой камеры с VideoCapture::set
проверяя возвращаемое значение, чтобы увидеть, было ли оно успешным. Есть не так много разрешений для поиска, поэтому это должно быть жизнеспособным.
Сам ищу по той же теме:
Как было сказано ранее, прямого свойства нет, но вы можете найти поддерживаемые разрешения, пытаясь определить допустимые разрешения камеры:
Здесь 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;
}
Я надеюсь, что это будет полезно для будущих пользователей.
Этот вид аппаратных возможностей можно запрашивать с USB-устройств, если камера UVC-совместимый. Это зависит от драйвера / прошивки устройства. Смотрите, например, эти Требования Microsoft угадать, какую поддержку вы можете ожидать на платформах Windows.