OpenCV-从C/C++中的默认网络摄像头获取图片-GTK问题
OpenCV - Getting picture from default webcam in C/C++ - GTK Issues
我有一个简单的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的C
或C++
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模块。
-
构建支持GTK3的OpenCV(
WITH_GTK=ON
WITH_GTK3=ON
)。 -
如果可以的话,使用Qt而不是GTK。
相关文章:
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- 使用OpenCV和覆盆子上的多个网络摄像头拍摄延时摄影,出现多个V4L错误
- 使用源读取器从网络摄像头源获取 H264 样本
- 为什么我不能让 3 个网络摄像头与 pthreads 并行运行?
- 从 OpenCV 3 切换到 OpenCV 4 会导致网络摄像头以最大 5 fps 的速度录制,而不是通常的 30 f
- 媒体基金会可以允许多个客户端同时访问单个网络摄像头设备吗?
- 从C++调用网络摄像头并在 Python 中显示图像
- 从 WinPE 下的网络摄像头捕获?
- OpenCV没有显示来自Macbook网络摄像头的视频
- 使用OpenCV和C++在按键上截取网络摄像头源的屏幕截图
- 我正在尝试在树莓派中连接两个网络摄像头
- 使用 FFmpeg 编码和带有网络摄像头的 UDP
- TensorFlow OpenCV网络摄像头悬挂
- 使用来自视频文件或网络摄像头的 Kinect 面部跟踪
- OpenCV 将剪影与网络摄像头流隔离
- OpenCV-从C/C++中的默认网络摄像头获取图片-GTK问题
- 在 OpenCV 中,设置曝光会导致我的网络摄像头软件无法自动调整曝光
- 无法使用OpenCV从辅助网络摄像头读取VideoCapture中的帧
- 使用Opencv直接从网络摄像头获取灰度图像
- 使用Qt显示来自OpenCV的网络摄像头流