OpenCV — получение изображения с веб-камеры по умолчанию в C / GTK

У меня есть простое приложение с графическим интерфейсом GTK + v3, и я использую библиотеку OpenCV, чтобы у меня была простая функция для фотографирования с одной веб-камеры, подключенной к моему компьютеру. Код включен в нижней части этого поста.

Я могу успешно получать данные изображения и отображать их на экране, но когда я включаю этот код в свой проект GTK + v3, я получаю ошибку при запуске, например:

(result:2944): Gtk-ERROR **: GTK+ 2.x symbols detected.
Using GTK+ 2.x and GTK+3 in the same process is not supported.
Trace/breakpoint trap.

Итак, это имеет смысл до сих пор. Одна из библиотек OpenCV, очевидно, использует Gtk + v2. Оказывается, если я уберу libopencv_highgui из моего списка библиотек для ссылки, у меня не будет этой проблемы. Однако функции, используемые для получения данных изображения с веб-камеры, включены в эту библиотеку по некоторым причинам.

Доступны ли другие функции через C или же C++ API для OpenCV, которые не требуют от меня использования libopencv_highgui и позволите мне с легкостью сделать снимок с веб-камеры?

Другая альтернатива, кажется, переписывает мой проект как приложение Gtk + v2, что было бы не так уж и плохо, поскольку я не слишком углубился в это.

Есть ли скрытая опция C там? (Простите за каламбур;)).

#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>
#include <stdio.h>
#include <errno.h>

using namespace std;
using namespace cv;

#define PROJECT_NAME       "CAMERA_MODULE" // Include before liblog
#include "../../lib/liblog/inc/log.h"
int cameraAcquireImage(void) {
CvCapture* capture = 0;
Mat frame, frameCopy, image;

//0=default, -1=any camera, 1..99=your camera
capture = cvCaptureFromCAM(CV_CAP_ANY);
if(!capture) {
logError("No camera interface detected");
return (-EIO);
}

cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );
if(capture) {
logError("Capture in progress");
for( ; ;) {
IplImage* iplImg = cvQueryFrame(capture);
frame = iplImg;

if(frame.empty()) {
break;
}
if(iplImg->origin == IPL_ORIGIN_TL) {
frame.copyTo(frameCopy);
} else {
flip(frame, frameCopy, 0);
}
cvShowImage( "result", iplImg );
if( waitKey( 10 ) >= 0 ) {
break;
}

}
}

cvReleaseCapture( &capture );
cvDestroyWindow("result");
return 0;
}

1

Решение

Я могу думать о следующих решениях:

  1. Понижение до GTK 2 — довольно просто.

  2. Поскольку VideoCapture является одним из немногих модулей, которые зависят от
    highgui, используйте что-нибудь еще для захвата видео (возможно Video4Linux)
    а затем использовать модули OpenCV, которые не зависят от highgui.

  3. Сборка OpenCV с поддержкой GTK 3 (WITH_GTK=ON WITH_GTK3=ON).

  4. Используйте Qt вместо GTK, если можете.

3

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

Других решений пока нет …

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