Ошибка ctypes: ошибка libdc1394: не удалось инициализировать libdc1394

Я пытаюсь скомпилировать мою программу в общую библиотеку, которую я могу использовать из кода Python, используя ctypes.

Библиотека компилируется с использованием этой команды:

g++ -shared -Wl,-soname,mylib -O3 -o mylib.so -fPIC [files] `pkg-config --libs --cflags opencv`

Однако, когда я пытаюсь импортировать его с помощью ctypes

from ctypes import *
mylib = CDLL("/path/to/mylib.so")
print mylib.test() // Expected output: Hello World

Я получаю следующую ошибку:

libdc1394 error: Failed to initialize libdc1394

Что происходит?

Ответ 1

Очень расстраивает то, что на самом деле никто не показывает конкретного решения. У меня возникла проблема после установки OpenCV. Для меня самым простым решением для удаления этого предупреждения было фактически отключить этот драйвер:

sudo ln /dev/null /dev/raw1394

Ответ 2

libdc1394 - это библиотека для управления оборудованием камеры. Я предполагаю, что наступает opencv, на который вы ссылаетесь. Может быть, драйвер ядра не загружается? Я думаю, есть ряд причин, почему он может потерпеть неудачу.

Возможно, какой-то эксперт OpenCV может лучше ответить. Но я уверен, что проблема заключается в стороне OpenCV lib.

Некоторые первоначальные поиски одного и того же сообщения об ошибке дали результаты по той же причине [1, 2]. Поэтому, если вы не можете найти /dev/raw1394 в своей файловой системе, попробуйте их.

UPDATE:

Кажется, что это только предупреждение. Модуль raw1394 кажется устаревшим, и некоторая версия libdc1394 может его искать, пока он исчез с обновлением. Поиск его дает много результатов и отчетов об ошибках. Но похоже, что программное обеспечение должно работать нормально. Поэтому, если вам это действительно не нужно, вы можете просто игнорировать его. [3, 4]

Ответ 3

Хорошо. Я потратил целый день на это.

В принципе, связь между /dev/raw1394 и /dev/null не является постоянной. Вы можете bash в свою виртуальную машину, вызовите ln /dev/null /dev/raw1394, но она будет действовать только до тех пор, пока вы не заново запустите свой контейнер.

Что я должен был сделать, это был самый простой, но не идеальный подход, это разместить ссылку во время запуска контейнера.

Я думал, что запустил это как сервис, но, похоже, слишком много для простой работы.

Как я, наконец, пришел на работу (это не красиво, но работает), это изменение CMD файла Docker:

CMD sh -c 'ln -s /dev/null /dev/raw1394'; <your-script-here>

Ответ 4

У меня была аналогичная проблема с точной работой Ubuntu под VirtualBox. Сначала я установил OpenCV в соответствии с этими инструкциями: https://help.ubuntu.com/community/OpenCV Это устранило несколько проблем, с которыми я пытался использовать другие методы, но проблема с libdc1394 все еще была там.

libdc1394 error: Failed to initialize libdc1394

Наконец я увидел goran комментарий

Итак, я включил USB-контроллер в virtualbox.... et voila! все работает отлично!

Спасибо, горан!

Ответ 5

Для людей, которые собрали свой собственный opencv и столкнулись с этой ошибкой и не нуждаются в поддержке видеозахвата FireWire, вы всегда можете перекомпилировать -D WITH_1394=OFF, как показано ниже:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_1394=OFF ./

Если вы отключите эту опцию, вы можете даже потерять зависимость libdc1394-22-dev (ubuntu). Хотя я лично не проверял это.

Ответ 6

Другим обходным путем при использовании изображения докеров является установка тома

docker run -v /dev/null:/dev/raw1394