質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2259閲覧

ROSのopencvを参照せずに手動で導入したopencvを参照したい

uytrewq12345

総合スコア13

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/02/05 06:04

編集2019/02/05 09:54

前提・実現したいこと

ROSのopencvを参照せずに手動で導入したopencvを参照したい

発生している問題・エラーメッセージ

OpenCV Error: Assertion failed (channels() == ((((dtype) & ((512 - 1) << 3)) >> 3) + 1)) in copyTo, file /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/core/src/copy.cpp, line 260 terminate called after throwing an instance of 'cv::Exception' what(): /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/core/src/copy.cpp:260: error: (-215) channels() == ((((dtype) & ((512 - 1) << 3)) >> 3) + 1) in function copyTo``` ### 該当のソースコード
### 試したこと HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn = 0, double stn = 0, double min_theta = 0, double max_theta = CV_PI のOutputArrayにあたる引数を,std::vector<cv::Vec2f>にしたところコンパイルエラーなし,実行問題なし. OutputArrayを,std::vector<cv::Vec3f>にしたところコンパイルエラーなし,実行時コアダンプ(上記エラー). ### 補足情報(FW/ツールのバージョンなど) Ubuntu 16.04 ROS kinetic 手動で導入したopencvは https://github.com/opencv/opencv.git よりgit clone してbuild. opencvのパスはCMakeLists.txtに次のように記載. find_package(OpenCV REQUIRED) target_link_libraries(test ${OpenCV_LIBRARIES}) エラーメッセージを見る限りおそらくROSの方のopencvが呼び出されているのが原因だと思うのですが, どのような記述をすればgitからダウンロードしたopencvを参照するようになるのでしょうか. (補足) $ ldd (実行ファイル名) の出力結果 linux-vdso.so.1 => (0x00007ffcf9ffd000) libopencv_highgui3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_highgui3.so.3.3 (0x00007fcaada65000) libopencv_imgcodecs3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3 (0x00007fcaad436000) libopencv_imgproc3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgproc3.so.3.3 (0x00007fcaaab40000) libopencv_core3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_core3.so.3.3 (0x00007fcaa9c06000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fcaa9884000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcaa957b000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fcaa9365000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcaa8f9b000) libQt5Widgets.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007fcaa890e000) libQt5Test.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Test.so.5 (0x00007fcaade54000) libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007fcaa83c6000) libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007fcaa7ef0000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fcaa7cd3000) libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007fcaa7a7a000) libwebp.so.5 => /usr/lib/x86_64-linux-gnu/libwebp.so.5 (0x00007fcaa781e000) libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007fcaa75f9000) libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007fcaa7384000) libjasper.so.1 => /usr/lib/x86_64-linux-gnu/libjasper.so.1 (0x00007fcaa712f000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fcaa6f15000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fcaa6d11000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fcaa6b09000) /lib64/ld-linux-x86-64.so.2 (0x00007fcaadca6000) libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007fcaa68b6000) libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fcaa65a5000) libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fcaa626b000) libharfbuzz.so.0 => /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007fcaa600d000) libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007fcaa5d69000) libicui18n.so.55 => /usr/lib/x86_64-linux-gnu/libicui18n.so.55 (0x00007fcaa5907000) libicuuc.so.55 => /usr/lib/x86_64-linux-gnu/libicuuc.so.55 (0x00007fcaa5573000) libpcre16.so.3 => /usr/lib/x86_64-linux-gnu/libpcre16.so.3 (0x00007fcaa530d000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fcaa50eb000) libjbig.so.0 => /usr/lib/x86_64-linux-gnu/libjbig.so.0 (0x00007fcaa4edd000) libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fcaa4cd5000) libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fcaa4a65000) libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fcaa4843000) libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007fcaa4599000) libgraphite2.so.3 => /usr/lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007fcaa4373000) libGLX.so.0 => /usr/lib/x86_64-linux-gnu/libGLX.so.0 (0x00007fcaa4143000) libGLdispatch.so.0 => /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007fcaa3e75000) libicudata.so.55 => /usr/lib/x86_64-linux-gnu/libicudata.so.55 (0x00007fcaa23be000) libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fcaa21ba000) libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fcaa1fb4000) libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fcaa1da2000) 環境変数 $ env | grep -i path ROS_PACKAGE_PATH=/opt/ros/kinetic/share LD_LIBRARY_PATH=/opt/ros/kinetic/lib:/opt/ros/kinetic/lib/x86_64-linux-gnu XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0 XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0 DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path PATH=/opt/ros/kinetic/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path PYTHONPATH=/opt/ros/kinetic/lib/python2.7/dist-packages PKG_CONFIG_PATH=/opt/ros/kinetic/lib/pkgconfig:/opt/ros/kinetic/lib/x86_64-linux-gnu/pkgconfig CMAKE_PREFIX_PATH=/opt/ros/kinetic $ env | grep -i cv (該当変数なし)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwbQzhMkhhgEmhU

2019/02/05 09:16

まずはopencvに依存している実行可能ファイルに対して、(環境変数なども合わせた上で) $ ldd [ファイル名] で依存しているファイルを見て頂き、結果を質問内容に貼ってからコメント頂けると助かります。
uytrewq12345

2019/02/05 09:55

ありがとうございます. 依存ファイルと環境変数を質問内容に加え,更新しました. 他に不足している情報がありましたらご指摘お願いします.
guest

回答1

0

ベストアンサー

text

1libopencv_highgui3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_highgui3.so.3.3 (0x00007fcaada65000) 2libopencv_imgcodecs3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3 (0x00007fcaad436000) 3libopencv_imgproc3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgproc3.so.3.3 (0x00007fcaaab40000) 4libopencv_core3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_core3.so.3.3 (0x00007fcaa9c06000) 5

ということで、opencvのライブラリは全てROSのものが使用されるようです。
これらのライブラリは、すでに環境変数で設定されたパスでリンクされているようなので、

text

1LD_LIBRARY_PATH=/opt/ros/kinetic/lib:/opt/ros/kinetic/lib/x86_64-linux-gnu

手段としては、

text

1LD_LIBRARY_PATH=(手動で導入したopencvのパス):/opt/ros/kinetic/lib:/opt/ros/kinetic/lib/x86_64-linux-gnu

のように、先頭にパスを追加するしかないと思います。共有ライブラリのパス検索順序は↓を参考にしてください。

https://unix.stackexchange.com/questions/367600/what-is-the-order-that-linuxs-dynamic-linker-searches-paths-in

投稿2019/02/05 10:15

wwbQzhMkhhgEmhU

総合スコア343

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uytrewq12345

2019/02/05 11:33

ありがとうございます. ご指摘頂いたようにパスの修正を行ったのですが,解決には至りませんでした. 以下変更したパスになります. LD_LIBRARY_PATH=/usr/local/lib:/opt/ros/kinetic/lib:/opt/ros/kinetic/lib/x86_64-linux-gnu PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib:/opt/ros/kinetic/lib/pkgconfig:/opt/ros/kinetic/lib/x86_64-linux-gnu/pkgconfig CMAKE_PREFIX_PATH=/usr/local/lib:/opt/ros/kinetic (/usr/local/lib 以下には,opencv関連のsoファイルが存在しています) この状態でcmakeをやり直すと次のようなメッセージが得られます. -- Found OpenCV: /opt/ros/kinetic (found version "3.3.1") find_package()の段階で別のパスを参照していると思うのですが, どのような修正を加えれば良いかお分かりになるでしょうか. いくつか必要そうな情報を追記します.不勉強のため,情報の過不足等ありましたらご指摘ください. .pcファイルの場所 /opt/ros/kinetic/lib/x86_64-linux-gnu/pkgconfig/opencv-3.3.1-dev.pc (/usr/lib/pkgconfig/ 以下にはopencv関連の.pcは見当たりませんでした) $ ls /usr/local/lib/cmake/opencv4/ OpenCVConfig-version.cmake OpenCVModules-release.cmake OpenCVConfig.cmake OpenCVModules.cmake (/opt/ros/kinetic/lib/cmake/ 以下にはopencv関連のファイルは見当たりませんでした)
wwbQzhMkhhgEmhU

2019/02/05 12:06

まずは環境変数を変えた状態でlddを実施して、ちゃんと変化するかどうかをご確認ください。
uytrewq12345

2019/02/05 12:21

たびたびありがとうございます. 環境変数を変更した状態でのlddの実行結果は以下のようになります. $ldd ./practice| grep -i cv libopencv_highgui3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_highgui3.so.3.3 (0x00007f3ceee00000) libopencv_imgcodecs3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3 (0x00007f3cee7d1000) libopencv_imgproc3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgproc3.so.3.3 (0x00007f3cebedb000) libopencv_core3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_core3.so.3.3 (0x00007f3ceafa1000) 依存ファイルは変わらずROSのopencvを参照しているようで,問題の解決には至りませんでした.
wwbQzhMkhhgEmhU

2019/02/05 12:29

変わってないですね。では、例えば、 /usr/local/lib/x86_64-linux-gnu/libopencv_highgui3.so.3.3 は存在していますか?
uytrewq12345

2019/02/05 12:46

存在していません. 関係ありそうな箇所でのsoファイルは以下のようになります. $ ls /usr/local/lib/x86_64-linux-gnu (lib/ 以下にx86_64-linux-gnu自体が存在していません) $ ls /usr/lib/x86_64-linux-gnu/ | grep -i cv libopencv_core.so.2.4 libopencv_core.so.2.4.9 libopencv_imgproc.so.2.4 libopencv_imgproc.so.2.4.9 $ ls /usr/lib/ | grep -i cv (該当ファイルなし) $ ls /usr/local/lib/ | grep -i cv (gitでインストールしたopencv4の.soファイル)
wwbQzhMkhhgEmhU

2019/02/05 12:51

では、/usr/local/lib/libopencv_highgui3.so.3.3がある前提で、 file /usr/local/lib/libopencv_highgui3.so.3.3 とすると、何が表示されますか?
uytrewq12345

2019/02/05 13:02

次のような結果になります. $ file /usr/local/lib/libopencv_highgui3.so.3.3 /usr/local/lib/libopencv_highgui3.so.3.3: cannot open `/usr/local/lib/libopencv_highgui3.so.3.3' (No such file or directory) gitからインストールされたのはopencv4系で,ROS以外で以前にopencvをインストールしたことはないので,3系のsoファイルは存在しないと思われます.
wwbQzhMkhhgEmhU

2019/02/05 13:05

じゃあ、そもそも動作させたい実行可能プログラムの再ビルドが必要ですね。リンクできないので。
uytrewq12345

2019/02/05 13:13

たびたびすみません. プログラムの再ビルドといいますと.具体的にはどういうことになるでしょうか. 一応先ほどの環境変数を変えた状態で,cmakeの際に自動生成されるファイルを消去,cmakeを行いMakefileを再生成,makeをしなおす,というところまでは行いました.
wwbQzhMkhhgEmhU

2019/02/05 13:18

ええーっと、そちらの実行可能プログラム自体は全く聞いていないので、きちんとリンクできるようインクルードとライブラリの設定が出来てる状態で、ビルドしてればいいのですが。。。
wwbQzhMkhhgEmhU

2019/02/05 13:20

ようは自分でビルドしたOpenCVのヘッダをインクルードして、そのライブラリをリンクしてればいいだけです。
wwbQzhMkhhgEmhU

2019/02/05 13:43

ライブラリが変わったら通常アプリケーションは再ビルドが必要であり、場合によっては実装まで変更しないとダメです。 たまにパッケージで入れたものが気に入らずに再ビルドしたものを入れ直すとかやりますが、あれは、あくまでコンパイルオプションが気に入らないとか、I/Fが変わらない範囲の変更だと分かっているパッチを当てたいからするものであって、ライブラリ自体のメジャーバージョンが上がるようなものは想定外ですよ。
uytrewq12345

2019/02/05 13:55

基礎知識の不足から先ほどから見当はずれの返答をしてしまっているようで申し訳ありません. 先ほど,環境変数を CMAKE_PREFIX_PATH=/usr/local:/opt/ros/kinetic に変更したところ,opencv4が動作することを確認できました.当初の目的は達成できましたので,とりあえず質問自体はこれで終了にしようと思います. こちらの基礎知識の不足にもかかわらず,長々とつきあって頂いて大変感謝しております.そもそもプログラムの基本的な概念を理解できていなかったことを痛感しました. 今後も懲りずに質問することがあるかもしれませんが,もしお時間があればお付き合いいただければ助かります.重ねてになりますが,本当にありがとうございました.
wwbQzhMkhhgEmhU

2019/02/05 14:12

ようはOpenCVの新しいバージョンで動くようにアプリケーションをビルドしたいんだけど、うまくできなかくて困ってるから助けてって話だったんですね。そして、アプリケーションのビルドにはCMakeを使っていた、と。参照がどうとか書いていたので、共有ライブラリの動的なリンクに問題があるだけで、ビルドまでは全て終わっているものと思っていました。 基本的なことしかしていないなら大丈夫でしょうけど、凝ったことしてるとバージョンアップで動かないということもよくあるので、お気をつけください。とりあえずlddだけ覚えてればもう少し正確に最初から説明できてたと思うので、意味はあったと思っておきます。
uytrewq12345

2019/02/05 14:21

はい,その通りです.不正確な理解で言葉を使ってしまい申し訳ありませんでした. lddも初めて知ったコマンドで勉強になりました. 今後とも機会があればよろしくお願い致します.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問