mao*_*aou 6 c++ linux opencv nix
我正在尝试使用 nix 包管理器让 OpenCV hello world 程序运行,但它会抛出错误:
OpenCV 错误:未指定错误(该功能未实现。使用 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,然后在函数 cvNamedWindow 中重新运行 cmake 或配置脚本
我使用以下 default.nix 文件来创建 nix-shell
with import <nixpkgs> {}; {
cimgEnv = stdenv.mkDerivation {
name = "cimgdev";
buildInputs = [ pkgconfig stdenv cimg xorg.libX11 boost opencv gnome.gtk ];
};
}
Run Code Online (Sandbox Code Playgroud)
编译并运行以下代码
#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;
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令
g++ `pkg-config --cflags opencv` opencvtest.cpp `pkg-config --libs opencv` -o opencvtest
Run Code Online (Sandbox Code Playgroud)
它可以编译,但如果我尝试运行它,我会收到之前的错误消息。
我尝试了 CMake,结果相同。
小智 8
OpenCV 是在没有 GTK 支持的情况下构建的。在opencv包定义中,enableGtk2默认为false. 要启用它,请覆盖您的参数default.nix:
let
opencvGtk = opencv.override (old : { enableGtk2 = true; });
in
...
buildInputs = [... opencvGtk ...];
...
Run Code Online (Sandbox Code Playgroud)
除非你想直接使用它,gtk2否则不需要添加任何东西。经过漫长的 opencv 重建后,构建并运行上面的代码可以工作(给出):pkgconfigbuildInputslena.jpg
第一眼看到这个。
看起来你的 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)
Run Code Online (Sandbox Code Playgroud)
您可以看到很多 GUI 支持,包括如上所述的 Gtk2。因此,按照所述安装 ibgtk2.0-dev 和 pkg-config 。确保 HAVE_GTK 变量有效。通过CMake配置后,默认开启GTK的支持。否则你可以检查一下。
如果您发现任何不正确的地方,请编辑/评论。
| 归档时间: |
|
| 查看次数: |
2574 次 |
| 最近记录: |