Подтвердить что ты не робот

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

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

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

Я знаю, что я не первый, у кого есть эта проблема, но мне еще предстоит найти решение после того, как много гуглингов и чистки 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 ERROR", как описано выше, и я получаю выход 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/

4b9b3361

Ответ 1

Это ошибка в версии 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, см. code, но не в cap_libv4l.cpp.)

Обходной путь для того, чтобы версия v4l OpenCV 2.4 работала с фиксированным разрешением, отличным от 640x480, изменяя значения для DEFAULT_V4L_WIDTH и DEFAULT_V4L_HEIGHT в модули /highgui/src/cap _v4l.cpp и восстановление OpenCV, ответ.

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

-D WITH_LIBV4L=ON

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

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

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

Ответ 2

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

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

Дополнительную информацию можно найти на этой

Ответ 3

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

sudo cmake -D CMAKE_BUILD_TYPE = RELEASE -D WITH_OPENCL = OFF -D BUILD_PERF_TESTS = OFF -D BUILD_SHARED_LIBS = OFF -D JAVA_INCLUDE_PATH = $JAVA_HOME/include -D JAVA_AWT_LIBRARY = $JAVA_HOME/jre/lib/arm/libawt.so - D JAVA_JVM_LIBRARY = $JAVA_HOME/jre/lib/arm/server/libjvm.so -D CMAKE_INSTALL_PREFIX =/usr/local -D BUILD_TESTS = OFF -D WITH_MATLAB = OFF -D WITH_CUFFT = OFF -D WITH_CUDA = OFF -D WITH_CUBLAS = OFF -D WITH_GTK = OFF -D WITH_WEBP = OFF -D BUILD_opencv_apps = OFF -D BUILD_PACKAGE = OFF -D WITH_LIBV4L = ON..

Ответ 4

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

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

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