OpenCV: не удается установить разрешение видеозахвата

Я использую OpenCV 2.4.5 на Ubuntu 12.04 64-бит. Я хотел бы иметь возможность установить разрешение ввода с моей веб-камеры Logitech C310. Камера поддерживает до 1280x960 при 30fps, и я могу просматривать видео с этим разрешением в guvcview. Но OpenCV всегда получает видео только на 640x480.

попытка изменить разрешение с помощью cap.set (CV_CAP_PROP_FRAME_WIDTH, 1280) и cap.комплект(CV_CAP_PROP_FRAME_HEIGHT, 960) сразу после создания захватить видео крышка имеет нет эффекта; попытка установить их непосредственно перед получением каждого кадра приводит к немедленному сбою программы. Я также не могу уменьшить разрешение с помощью этого метода. Я также получаю сообщение об ошибке "HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP". Я думаю, что это может быть связано, потому что он появляется один раз, когда создается видеозапись, и один раз, когда я пытаюсь установить ширину и высоту (но, как ни странно, не если я пытаюсь установить только один из них).

Я знаю, что я не первый с этой проблемой, но у меня тем не менее, чтобы найти решение после долгого гугления и очистки SO и в других местах в интернете (среди многих вещей, которые я уже пытался безрезультатно, ответ на этот вопрос StackOverflow: увеличение разрешения захвата камеры в OpenCV). Это ошибка в OpenCV? Если и так, то довольно яркий.

вот пример кода, который демонстрирует проблему (просто модифицированная версия кода Видеодисплея OpenCV):

#include <cv.h>
#include <highgui.h>
using namespace cv;

int main(int argc, char** argv)
{
    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
            return -1;

    cap.set(CV_CAP_PROP_FRAME_WIDTH, 160);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 120);

    Mat image;
    namedWindow("Video", CV_WINDOW_AUTOSIZE);

    while(1)
    {
            // cap.set(CV_CAP_PROP_FRAME_WIDTH, 160);
            // cap.set(CV_CAP_PROP_FRAME_HEIGHT, 120);
            cap >> image;

            imshow("Video", image);

            if(waitKey(10) == 99 ) break;
    }
    return 
}

как есть, это дает мне два "Ошибка HIGHGUI", как описано выше, и я получаю выход 640x480. Я знаю, что 160x120-это разрешение, которое моя камера поддерживает от запуска v4l2-ctl --list-formats-ext. Если я раскомментируйте две закомментированные строки в цикле while, то программа вылетает сразу.

Они могут быть связаны или иметь возможные решения:http://answers.opencv.org/question/11427/decreasing-capture-resolution-of-webcam/, http://answers.opencv.org/question/30062/error-setting-resolution-of-video-capture-device/

4 ответов


это ошибка в блоке помощи v4l "версия" (сборка) OpenCV 2.4 (включая 2.4.12), но ошибка не в libv4l версия. Для OpenCV 3.1.0 ни версия v4l, ни версия libv4l не имеют ошибки.

(сообщение об ошибке ошибка HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP указывает, что у вас есть версия v4l; сообщение находится в cap_v4l.cpp см.код, но не в cap_libv4l.cpp.)

A решение получить версию V4l OpenCV 2.4. на работу в основные разрешение, отличное от 640x480 меняя значения DEFAULT_V4L_WIDTH и DEFAULT_V4L_HEIGHT in modules/highgui/src/cap_v4l.cpp и восстановление OpenCV, слава этому ответ.

если вы хотите создать версию libv4l вместо этого, все, что вам, вероятно, нужно сделать, это установить libv4l-dev и перестроить OpenCV;WITH_LIBV4L был включен по умолчанию для меня. Если это не так, ваша команда cmake должна содержать

-D WITH_LIBV4L=ON

выход cmake (или строка версии.tmp) для сборки libv4l содержит что-то вроде

  Video I/O:
    ...
    V4L/V4L2:   Using libv4l1 (ver 0.8.6) / libv4l2 (ver 0.8.6)

(для сборки v4l это просто V4L/V4L2: NO/YES.)


вы можете использовать v4l2-ctl для установки размера кадра захваченного видео, как показано ниже.

v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=1

вы можете найти более подробную информацию по этой ссылке


просто хотел добавить мои параметры CMAKE для сборки с Java на Raspberry Pi 3 на основе всеобъемлющего ответа Ульриха для OpenCV 3.2.0. Создайте папку / build a в той же папке, что и OpenCV CMakeList.txt и выполните этот скрипт для папки new / build:

судо-х -Д CMAKE_BUILD_TYPE=релиз -Д WITH_OPENCL=выкл -Д BUILD_PERF_TESTS=выкл -Д BUILD_SHARED_LIBS=выкл -Д JAVA_INCLUDE_PATH=$переменной JAVA_HOME/включить-Д JAVA_AWT_LIBRARY=$переменной JAVA_HOME/JRE и/lib в/руки/libawt.так Д JAVA_JVM_LIBRARY=$переменной JAVA_HOME/JRE и/Либ/АРМ/сервера/libjvm.так Д CMAKE_INSTALL_PREFIX=/usr/местные -Д BUILD_TESTS=выкл -Д WITH_MATLAB=выкл -Д WITH_CUFFT=выкл -Д WITH_CUDA=выкл -Д WITH_CUBLAS=выкл -Д WITH_GTK=выкл -Д WITH_WEBP=выкл -Д BUILD_opencv_apps=выкл -Д BUILD_PACKAGE=выкл -Д WITH_LIBV4L=на ..


возможно, вы можете попробовать это, но я не уверен, что это то, что вы хотите:

#include <X11/Xlib.h>

Display* disp = XOpenDisplay(NULL);
Screen*  scrn = DefaultScreenOfDisplay(disp);
int height = scrn->height;
int width  = scrn->width;

//Create window for the ip cam video
cv::namedWindow("Front", CV_WINDOW_NORMAL);

cvSetWindowProperty( "Front", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN );

//Position of the screen where the video is shows
cvMoveWindow("Front", 0, 0);
cvResizeWindow( "Front", width, height );

Как это вы получаете полный экран для любого экрана.