Я пытаюсь заставить работать программу 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, с тем же результатом.
Первый взгляд на этот.
Похоже, что ваша сборка 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 будет включена. В противном случае вы можете проверить это.
Пожалуйста, отредактируйте / прокомментируйте, если вы видите что-то не так.
OpenCV был собран без поддержки GTK. в определение пакета opencv, enableGtk2
по умолчанию false
, Чтобы включить его, переопределите аргумент в вашем default.nix
:
let
opencvGtk = opencv.override (old : { enableGtk2 = true; });
in
...
buildInputs = [... opencvGtk ...];
...
Там нет необходимости добавлять gtk2
ни чего кроме pkgconfig
в buildInputs
если вы не хотите использовать его напрямую.
После долгой перестройки opencv, сборка и запуск приведенного выше кода работает (дано lena.jpg
):