2

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

OpenCV Error: Unspecified error (该功能未实现。用Windows、GTK+ 2.x或Carbon支持重建库。如果你在Ubuntu或Debian上,安装libgtk2.0-dev和pkg-config,然后重新运行cmake或配置脚本)在 cvNamedWindow,文件 /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 或 Carbon 支持重建库。如果您在 Ubuntu 或 Debian 上,请安装 libgtk2.0-dev 和 pkg-config,然后重新运行 cmake 或在函数 cvNamedWindow 中配置脚本

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

with import <nixpkgs> {}; {
  cimgEnv = stdenv.mkDerivation {
  name = "cimgdev";
  buildInputs = [ pkgconfig stdenv cimg xorg.libX11 boost opencv gnome.gtk ];
  }; 
}

编译并运行以下代码

#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

它可以编译,但如果我尝试运行它,我会收到之前的错误消息。

我尝试了 CMake,结果相同。

4

3 回答 3

3

OpenCV 是在没有 GTK 支持的情况下构建的。在opencv 包定义中,enableGtk2默认为false. 要启用它,请覆盖您的参数default.nix

let
  opencvGtk = opencv.override (old : { enableGtk2 = true; });
in 
   ...
   buildInputs = [... opencvGtk ...];
   ...

除非您想直接使用它,否则无需添加gtk2任何东西。在冗长的 opencv 重建之后,构建和运行上面的代码(给定):pkgconfigbuildInputslena.jpg

有用

于 2018-12-13T08:37:36.910 回答
1

我知道这个问题是针对 C++ 的,但由于这个页面是谷歌中寻找与 python 相同问题的人的第一个结果,我认为为 python 提供解决方案也很有用......</p>

所以这是一个 shell.nix 示例(将 python37 替换为您选择的版本):

{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  name = "dev-shell";
  buildInputs = [
    pkgs.python37Packages.numpy
    pkgs.python37Packages.flask
    # …
    (pkgs.python37Packages.opencv4.override { enableGtk2 = true; })
  ];
}

或者以一种不那么冗长的方式:

{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  name = "dev-shell";
  buildInputs = with pkgs.python37Packages; [
    numpy
    flask
    # …
    (opencv4.override { enableGtk2 = true; })
  ];
}
于 2021-08-08T12:27:00.710 回答
0

第一眼看到这个。

似乎您的 OpenCV 构建缺乏对适当平台的UI 支持(主要是它们在 highgui 库中)。我从 OpenCV CMakeLists.txt得到这些东西

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)

您可以看到很多 GUI 支持,包括如前所述的 Gtk2。所以安装 ibgtk2.0-dev 和 pkg-config 如前所述。确保 HAVE_GTK 变量有效。通过 CMake 配置后,默认开启 GTK 支持。否则你可以检查一下。

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

于 2016-11-18T00:47:54.543 回答