OpenCV-从C/C++中的默认网络摄像头获取图片-GTK问题

OpenCV - Getting picture from default webcam in C/C++ - GTK Issues

本文关键字:摄像头 网络 获取 取图片 问题 -GTK 默认 C++ OpenCV-      更新时间:2023-10-16

我有一个简单的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,我就不会有这个问题。然而,由于某种原因,用于从网络摄像头获取图像数据的功能包含在该库中。

是否有其他功能可以通过OpenCV的CC++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;
}

我可以想到以下解决方案:

  1. 降级到GTK 2-非常简单。

  2. 由于VideoCapture是为数不多的依赖于highgui,使用其他东西进行视频捕获(也许是Video4Linux)然后使用不依赖highgui的OpenCV模块。

  3. 构建支持GTK3的OpenCV(WITH_GTK=ONWITH_GTK3=ON)。

  4. 如果可以的话,使用Qt而不是GTK。