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
どうしたの?
誰も実際に具体的な解決策を示していないことに非常にイライラします。 OpenCVのインストール後にこの問題が発生しました。私にとって、この警告を削除する最も簡単な解決策は、実際にこのドライバーを無効にすることでした:
Sudo ln /dev/null /dev/raw1394
libdc1394
は、カメラハードウェアを制御するためのライブラリです。リンクしたopencvが来ると思います。たぶん、カーネルドライバーが読み込まれないのでしょうか。失敗する理由はいくつかあると思います。
おそらく、OpenCVの専門家の方がより良い回答をすることができます。しかし、問題はOpenCV lib側にあると確信しています。
同じエラーメッセージの最初の検索で、同じ理由[ 1 、 2 ]の結果が得られました。ファイルシステムで/dev/raw1394
が見つからない場合は、それらを試してください。
これは警告にすぎないようです。モジュールraw1394は非推奨になっているようで、一部のlibdc1394バージョンはアップデートで消えたときにそれを探しているかもしれません。それを検索すると、多くの結果とバグレポートが得られます。しかし、ソフトウェアは正常に動作するはずです。したがって、本当に必要ない場合は無視してください。 [、 4 ]
はい。私はそれに一日中過ごしました。
基本的に、/dev/raw1394
と/dev/null
の間のリンクは永続的ではありません。 VMにbashしてln /dev/null /dev/raw1394
を呼び出すことができますが、コンテナーを再起動するまで持続します。
私がしなければならなかったのは、最も単純ではあるが完璧なアプローチではないように思えましたが、コンテナの起動時にリンクを配置することです。
私はそれをサービスとして実行することを考えましたが、単純な仕事には多すぎるように思われました。
私がようやく機能するようになったのは(きれいではありませんが機能します)、DockerfileのCMD
を変更することです。
CMD sh -c 'ln -s /dev/null /dev/raw1394'; <your-script-here>
VirtualBoxの下でUbuntuを正確に実行すると、同様の問題が発生しました。まず、次の手順に従ってOpenCVをインストールしました: https://help.ubuntu.com/community/OpenCV これにより、他の方法を試していたいくつかの問題が修正されましたが、libdc1394の問題はまだありました。
libdc1394 error: Failed to initialize libdc1394
それで、virtualboxでUSBコントローラーを有効にしました。すべてが完璧に機能します!
ゴランありがとう!
独自のopencvをコンパイルしてこのエラーが発生し、firewireビデオキャプチャサポートが必要ない場合は、次のように-D WITH_1394=OFF
オプションを使用していつでも再コンパイルできます。
cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_1394=OFF ./
このオプションをオフにすると、libdc1394-22-dev依存関係(ubuntu)を失うことさえできます。私はこれを個人的にテストしていませんが。
Dockerイメージを使用する別の回避策は、ボリュームをマウントすることです
docker run -v /dev/null:/dev/raw1394