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

标签 c++ c opencv gtk gtk3

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

是否有其他函数可以通过 CC++ 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. 降级到 GTK 2 - 非常简单。

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

  3. 构建支持 GTK 3 的 OpenCV(WITH_GTK=ON WITH_GTK3=ON)。

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

关于c++ - OpenCV - 从 C/C++ 中的默认网络摄像头获取图片 - GTK 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22029939/

相关文章:

c++ - 如何从c python api中的PyCodeObject获取源代码?

c++ - 将#warning 放入#define 的正文中

opencv - 从视频中聚类人脸

c++ - Opencv windows 7 cmake mingw-32 报错

android - 在 android studio 上使用 NDK 构建原生 openCV

c++ - C++ 中 std::resize(n) 和 std::shrink_to_fit 的区别?

java - JNA 无效的内存访问

c++ - 是否有一个不会被省略的 move 构造的简单示例?

c - 如何通过跳过标签之间的所有值来仅打印(C 代码)XML 标签?

c - 从 C 函数的指针参数中获取值