web-dev-qa-db-fra.com

erreur ctypes: erreur libdc1394: échec de l'initialisation de libdc1394

J'essaie de compiler mon programme dans une bibliothèque partagée que je peux utiliser depuis le code Python en utilisant ctypes.

La bibliothèque compile bien en utilisant cette commande:

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

Cependant, quand j'essaie de l'importer avec ctypes

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

Je reçois l'erreur suivante:

libdc1394 error: Failed to initialize libdc1394

Que se passe-t-il?

67
fredley

Très frustrant que personne ne montre réellement une solution concrète. J'ai eu ce problème après l'installation d'OpenCV. Pour moi, la solution la plus simple pour supprimer cet avertissement était de désactiver ce pilote:

Sudo ln /dev/null /dev/raw1394
181
Vad

libdc1394 est une bibliothèque permettant de contrôler le matériel de la caméra. Je présume que cela vient de l’openvv que vous associez. Peut-être que le pilote du noyau ne se charge pas? J'imagine que cela peut échouer pour plusieurs raisons.

Peut-être qu'un expert OpenCV pourra mieux vous répondre. Mais je parie que le problème est du côté de la librairie OpenCV.

Une recherche initiale du même message d'erreur a donné des résultats pour les mêmes raisons [ 1 , 2 ]. Donc, si vous ne trouvez pas /dev/raw1394 sur votre système de fichiers, essayez ceux-ci.

MISE À JOUR:

Il semble que cela ne soit qu'un avertissement. Le module raw1394 semble être obsolète et une version de libdc1394 pourrait le rechercher alors qu'il disparaissait avec une mise à jour. Sa recherche donne de nombreux résultats et rapports de bugs. Mais il semble que le logiciel devrait fonctionner correctement. Donc, si vous n'en avez pas vraiment besoin, vous pouvez simplement l'ignorer. [, 4 ]

30
luk32

D'accord. J'ai passé une journée entière dessus.

Fondamentalement, le lien entre /dev/raw1394 et /dev/null n'est pas permanent. Vous pouvez vous connecter à votre VM, appelez ln /dev/null /dev/raw1394 _, mais cela ne durera que jusqu'au redémarrage de votre conteneur.

Ce que je devais faire, cela semblait être la solution la plus simple, mais non parfaite, consiste à placer la liaison lors du démarrage du conteneur.

Je pensais dans Exécuter en tant que service, mais cela me semblait trop pour un travail simple.

La façon dont je suis finalement arrivé au travail ((ce n’est pas joli, mais ça marche), est de changer le CMD du Dockerfile:

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

8
Ivan Seidel

J'ai eu un problème similaire avec un Ubuntu précis fonctionnant sous VirtualBox. J'ai d'abord installé OpenCV en suivant ces instructions: https://help.ubuntu.com/community/OpenCV Cela résolut plusieurs problèmes lorsque j'avais essayé d'autres méthodes, mais le problème avec libdc1394 était toujours présent.

libdc1394 error: Failed to initialize libdc1394

J'ai finalement vu goran commenter le réponse précédente

J'ai donc activé le contrôleur USB dans la virtualbox ... et le tour est joué! tout fonctionne parfaitement!

Merci Goran!

6
jeremie

Pour les personnes qui ont compilé leur propre opencv et rencontrent cette erreur, et n’ont pas besoin du support de capture vidéo Firewire, vous pouvez toujours recompiler avec -D WITH_1394=OFF option, comme ci-dessous:

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

Si vous désactivez cette option, vous pouvez même perdre la dépendance libdc1394-22-dev (ubuntu). Bien que je n'ai pas personnellement testé cela.

4
Ying-Chi I

Une autre solution pour utiliser une image de menu fixe consiste à monter un volume.

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

3
Syi