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 );
Как это вы получаете полный экран для любого экрана.