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?
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
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.
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 ]
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>
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!
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.
Une autre solution pour utiliser une image de menu fixe consiste à monter un volume.
docker run -v /dev/null:/dev/raw1394