Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何让OpenCV在nix中工作?_C++_Linux_Opencv_Nix - Fatal编程技术网

C++ 如何让OpenCV在nix中工作?

C++ 如何让OpenCV在nix中工作?,c++,linux,opencv,nix,C++,Linux,Opencv,Nix,我正在尝试使用nix软件包管理器使OpenCV hello world程序正常工作,但它会抛出错误: OpenCV错误:未指定的错误(该函数未实现。使用Windows、GTK+2.x或Carbon支持重建库。如果您在Ubuntu或Debian上,请安装libgtk2.0-dev和pkg config,然后重新运行cmake或configure脚本),位于CVNamedwindoww文件/tmp/nix-build-OpenCV-2.4.13.drv-0/OpenCV-2.4.13-src/mod

我正在尝试使用nix软件包管理器使OpenCV hello world程序正常工作,但它会抛出错误:

OpenCV错误:未指定的错误(该函数未实现。使用Windows、GTK+2.x或Carbon支持重建库。如果您在Ubuntu或Debian上,请安装libgtk2.0-dev和pkg config,然后重新运行cmake或configure脚本),位于CVNamedwindoww文件/tmp/nix-build-OpenCV-2.4.13.drv-0/OpenCV-2.4.13-src/modules/highgui/src/window.cpp中,第483行 在抛出'cv::Exception'what():/tmp/nix-build-opencv-2.4.13.drv-0/opencv-2.4.13-src/modules/highgui/src/window的实例后终止调用。cpp:483:错误:(-2)未实现该函数。使用Windows、GTK+2.x或碳纤维支架重建库。如果您使用的是Ubuntu或Debian,请安装libgtk2.0-dev和pkg-config,然后在函数cvNamedWindow中重新运行cmake或configure脚本

我使用以下default.nix文件创建了一个nix shell

with import <nixpkgs> {}; {
  cimgEnv = stdenv.mkDerivation {
  name = "cimgdev";
  buildInputs = [ pkgconfig stdenv cimg xorg.libX11 boost opencv gnome.gtk ];
  }; 
}
它可以编译,但如果我尝试运行它,就会收到前面的错误消息

我尝试了CMake,结果是一样的

第一眼看到

似乎您的OpenCV构建缺少合适的平台(主要是在highgui库中)。我从OpenCV得到这些东西

您可以看到很多GUI支持,包括前面提到的Gtk2。因此,如前所述安装ibgtk2.0-dev和pkg-config。确保_GTK变量有效。由CMake配置后,默认情况下,GTK的支持将打开。否则你可以检查一下


如果您发现任何不正确的地方,请进行编辑/评论

OpenCV是在没有GTK支持的情况下构建的。在中,
enableGtk2
默认为
false
。要启用它,请重写
default.nix中的参数:

让
opencvGtk=opencv.override(旧的:{enableGtk2=true;});
在里面
...
buildInputs=[…opencvGtk…];
...

无需将
gtk2
pkgconfig
之外的任何内容添加到
buildInputs
中,除非您想直接使用它。 在漫长的opencv重建之后,构建并运行上述代码(给定
lena.jpg
):


我不熟悉nix,但错误消息显示
install libgtk2.0-dev和pkg config
,但您似乎没有在任何地方指定
libgtk2.0-dev
@KenY-N-我在default.nix文件中添加了“gnome.gtk”,我认为这相当于nix包中的libgtk2.0-dev。我在default.nix文件中添加了“gnome.gtk”,我认为这相当于nix包中的libgtk2.0-dev。pkgconfig也在那里。
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main() {

  Mat image;

  image = imread("lena.jpg", 1);

  if ( !image.data ) {
    cout << "No image data" << endl;
    return -1;
  }

  namedWindow("Display Image", WINDOW_AUTOSIZE);
  imshow("Display Image", image);

  waitKey(0);

  return 0;
}
g++ `pkg-config --cflags opencv` opencvtest.cpp `pkg-config --libs opencv` -o opencvtest
status("")
status("  GUI: ")

if(HAVE_QT5)
  status("    QT 5.x:"            HAVE_QT        THEN "YES (ver ${Qt5Core_VERSION_STRING})" ELSE NO)
  status("    QT OpenGL support:" HAVE_QT_OPENGL THEN "YES (${Qt5OpenGL_LIBRARIES} ${Qt5OpenGL_VERSION_STRING})" ELSE NO)
elseif(HAVE_QT)
  status("    QT 4.x:"            HAVE_QT        THEN "YES (ver ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH} ${QT_EDITION})" ELSE NO)
  status("    QT OpenGL support:" HAVE_QT_OPENGL THEN "YES (${QT_QTOPENGL_LIBRARY})" ELSE NO)
else()
  if(DEFINED WITH_QT)
    status("    QT:" NO)
  endif()
  if(DEFINED WITH_WIN32UI)
    status("    Win32 UI:" HAVE_WIN32UI THEN YES ELSE NO)
  else()
    if(APPLE)
      if(WITH_CARBON)
        status("    Carbon:" YES)
      else()
        status("    Cocoa:"  YES)
      endif()
    else()
      if(HAVE_GTK3)
        status("    GTK+ 3.x:" HAVE_GTK THEN "YES (ver ${ALIASOF_gtk+-3.0_VERSION})" ELSE NO)
      elseif(HAVE_GTK)
        status("    GTK+ 2.x:" HAVE_GTK THEN "YES (ver ${ALIASOF_gtk+-2.0_VERSION})" ELSE NO)
      else()
        status("    GTK+:" NO)
      endif()
      status("    GThread :" HAVE_GTHREAD THEN "YES (ver ${ALIASOF_gthread-2.0_VERSION})" ELSE NO)
      status("    GtkGlExt:" HAVE_GTKGLEXT THEN "YES (ver ${ALIASOF_gtkglext-1.0_VERSION})" ELSE NO)
    endif()
  endif()
endif()

status("    OpenGL support:" HAVE_OPENGL THEN "YES (${OPENGL_LIBRARIES})" ELSE NO)
status("    VTK support:" HAVE_VTK THEN "YES (ver ${VTK_VERSION})" ELSE NO)