OpenCV - 从 C/C++ 中的默认网络摄像头获取图片 - GTK 问题
题
我有一个简单的 GTK+ v3 GUI 应用程序,并且我正在使用 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++
不需要我使用的 OpenCV API 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),然后使用不依赖Highgui的OpenCV模块。
构建支持 GTK 3 的 OpenCV (
WITH_GTK=ON
WITH_GTK3=ON
).如果可以的话,使用 Qt 而不是 GTK。
不隶属于 StackOverflow