Как заставить OpenCV работать в nix?

Я пытаюсь заставить работать программу OpenCV hello world с помощью менеджера пакетов nix, но ее ошибки вылетали:

Ошибка 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, затем повторно запустите cmake или настройте скрипт в функции cvNamedWindow

Я использовал следующий файл default.nix для создания оболочки nix

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, с тем же результатом.

1

Решение

Первый взгляд на этот.

Похоже, что ваша сборка OpenCV не хватает Поддержка пользовательского интерфейса для соответствующей платформы (в основном они находятся в библиотеке 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 будет включена. В противном случае вы можете проверить это.

Пожалуйста, отредактируйте / прокомментируйте, если вы видите что-то не так.

0

Другие решения

OpenCV был собран без поддержки GTK. в определение пакета opencv, enableGtk2 по умолчанию false, Чтобы включить его, переопределите аргумент в вашем default.nix:

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

Там нет необходимости добавлять gtk2 ни чего кроме pkgconfig в buildInputs если вы не хотите использовать его напрямую.
После долгой перестройки opencv, сборка и запуск приведенного выше кода работает (дано lena.jpg):

оно работает

0

По вопросам рекламы [email protected]