У меня есть простое приложение с графическим интерфейсом 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;
}
Я могу думать о следующих решениях:
Понижение до GTK 2 — довольно просто.
Поскольку VideoCapture является одним из немногих модулей, которые зависят от
highgui, используйте что-нибудь еще для захвата видео (возможно Video4Linux)
а затем использовать модули OpenCV, которые не зависят от highgui.
Сборка OpenCV с поддержкой GTK 3 (WITH_GTK=ON
WITH_GTK3=ON
).
Используйте Qt вместо GTK, если можете.
Других решений пока нет …