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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

5035閲覧

Raspberry piでOpenCVを利用したい

rrs

総合スコア7

OpenCV

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2017/06/05 08:25

編集2017/06/05 08:27

###前提・実現したいこと
Raspberry pi 2でOpenCV(2.4.0)を利用できるように設定を行っているのですが、コンパイルでエラーが発生しました。
全くの初心者で解決方法がわからないため、ご教授お願いいたします。

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

g++ sample.cpp /tmp/ccnPKNgp.o: 関数 `main' 内: sample.cpp:(.text+0x9c): `cv::imread(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)' に対する定義されていない参照です sample.cpp:(.text+0x110): `cv::_InputArray::_InputArray(cv::Mat const&)' に対する定義されていない参照です sample.cpp:(.text+0x124): `cv::_OutputArray::_OutputArray(cv::Mat&)' に対する定義されていない参照です sample.cpp:(.text+0x13c): `cv::flip(cv::_InputArray const&, cv::_OutputArray const&, int)' に対する定義されていない参照です sample.cpp:(.text+0x150): `cv::_InputArray::_InputArray(cv::Mat const&)' に対する定義されていない参照です sample.cpp:(.text+0x164): `cv::_OutputArray::_OutputArray(cv::Mat&)' に対する定義されていない参照です sample.cpp:(.text+0x17c): `cv::flip(cv::_InputArray const&, cv::_OutputArray const&, int)' に対する定義されていない参照です sample.cpp:(.text+0x190): `cv::_InputArray::_InputArray(cv::Mat const&)' に対する定義されていない参照です sample.cpp:(.text+0x1a4): `cv::_OutputArray::_OutputArray(cv::Mat&)' に対する定義されていない参照です sample.cpp:(.text+0x1bc): `cv::flip(cv::_InputArray const&, cv::_OutputArray const&, int)' に対する定義されていない参照です sample.cpp:(.text+0x1f0): `cv::namedWindow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)' に対する定義されていない参照です sample.cpp:(.text+0x23c): `cv::namedWindow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)' に対する定義されていない参照です sample.cpp:(.text+0x288): `cv::namedWindow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)' に対する定義されていない参照です sample.cpp:(.text+0x2d8): `cv::_InputArray::_InputArray(cv::Mat const&)' に対する定義されていない参照です sample.cpp:(.text+0x2ec): `cv::imshow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)' に対する定義されていない参照です sample.cpp:(.text+0x33c): `cv::_InputArray::_InputArray(cv::Mat const&)' に対する定義されていない参照です sample.cpp:(.text+0x350): `cv::imshow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)' に対する定義されていない参照です sample.cpp:(.text+0x3a0): `cv::_InputArray::_InputArray(cv::Mat const&)' に対する定義されていない参照です sample.cpp:(.text+0x3b4): `cv::imshow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)' に対する定義されていない参照です sample.cpp:(.text+0x3d4): `cv::waitKey(int)' に対する定義されていない参照です /tmp/ccnPKNgp.o: 関数 `cv::Mat::~Mat()' 内: sample.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x3c): `cv::fastFree(void*)' に対する定義されていない参照です /tmp/ccnPKNgp.o: 関数 `cv::Mat::release()' 内: sample.cpp:(.text._ZN2cv3Mat7releaseEv[cv::Mat::release()]+0x58): `cv::Mat::deallocate()' に対する定義されていない参照です collect2: ld returned 1 exit status

###該当のソースコード

#include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> int main(int argc, char *argv[]) { cv::Mat src_img = cv::imread("../../image/lenna.png", 1); if(src_img.empty()) return -1; cv::Mat v_img, h_img, b_img; cv::flip(src_img, v_img, 0); // 水平軸で反転(垂直反転) cv::flip(src_img, h_img, 1); // 垂直軸で反転(水平反転) cv::flip(src_img, b_img, -1); // 両方の軸で反転 cv::namedWindow("vertical flip image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO); cv::namedWindow("horizontal flip image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO); cv::namedWindow("both flip image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO); cv::imshow("vertical flip image", v_img); cv::imshow("horizontal flip image", h_img); cv::imshow("both flip image", b_img); cv::waitKey(0); }

###試したこと
下記のページなどを参考にOpenCV2.4.0のインストールを行いました。
http://homemadegarbage.0t0.jp/raspberry-pi-opencv3-1-0
https://iwaki2009.blogspot.jp/2015/08/raspberry-pi-2-opencv-2411.html

サンプルプログラムは下記のページのものを利用させていただきました。
http://opencv.jp/cookbook/opencv_img.html#image-flip

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

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

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

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

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

guest

回答2

0

ベストアンサー

rrsさん、

2017-04-10-raspbian-jessie.img を焼き直して、以下を確認しました。
C++のみでOpenCVを使用するなら、libopencv-devのみのインストールでいいようです。
他の設定が邪魔している可能性もあるので、クリーンインストールしてみて、動作確認してみてください。

  1. 起動後、ターミナルを開いて、以下を実行。

sudo sh -c 'apt update && apt upgrade -y && apt install -y libopencv-dev && reboot'

  1. パッケージ更新後、再起動するので、ターミナルを開いて、以下を実行して確認。

pkg-config --cflags opencv
pkg-config --libs opencv
(実行例)
pi@raspberrypi:~ $ pkg-config --cflags opencv
-I/usr/include/opencv
pi@raspberrypi:~ $ pkg-config --libs opencv
/usr/lib/arm-linux-gnueabihf/libopencv_calib3d.so ...省略... -lopencv_videostab
pi@raspberrypi:~ $

  1. 実行例のようになったら、以下をターミナルにコピペ。

sample.c ファイル作成.

cat <<EOF > sample.c
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int
main(int argc, char *argv[])
{
cv::Mat src_img = cv::imread("./Lenna.png", 1);
if(src_img.empty()) return -1;

cv::Mat v_img, h_img, b_img;
cv::flip(src_img, v_img, 0); // 水平軸で反転(垂直反転)
cv::flip(src_img, h_img, 1); // 垂直軸で反転(水平反転)
cv::flip(src_img, b_img, -1); // 両方の軸で反転

cv::namedWindow("vertical flip image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::namedWindow("horizontal flip image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::namedWindow("both flip image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::imshow("vertical flip image", v_img);
cv::imshow("horizontal flip image", h_img);
cv::imshow("both flip image", b_img);
cv::waitKey(0);
}
EOF

コンパイル

g++ ./sample.c -o sample pkg-config --cflags opencv pkg-config --libs opencv

Lenna画像取得

wget https://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png

実行

./sample

=> 反転処理された画像のウィンドウが3枚表示されました。

投稿2017/06/07 05:58

mt08

総合スコア1825

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

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

rrs

2017/06/07 06:36 編集

ご回答ありがとうございます。 1.を実行したのですが、こちらで下記のエラーメッセージが出ました。 sh: 1: apt: not found エラー内容について調べてみたのですが、良く理解できず… 解決方法について教えて頂けると幸いです。 何度も面倒な質問をしてしまい大変申し訳ございません。
mt08

2017/06/07 06:54

rssさん、 > sh: 1: apt: not found apt というコマンドが見つからない、といったエラーですね。 ターミナルに、apt と3文字打って、[Enter]を押して、"-bash: apt: command not found"と出たら、 aptと言うコマンドが見つからない、ということですが。。。 確認です。 - Raspbian "2017-04-10-raspbian-jessie.img" を使用していますか? => https://www.raspberrypi.org/downloads/raspbian/ から Raspbian Jessie with PIXEL の [Download ZIP] をダウンロード。 (ところで、イメージファイルをSDへ書き込みする方法はわかりますか?) 使ってるモノの、スタート地点から違うと、話が合わなくなってしまうと思うので、確認してみてください。
rrs

2017/06/12 03:16

aptをapt-getに置き換えて実行したところ、無事sampleのコンパイルおよび実行ができました。 (研究室で所持しているRaspberry Piで、新たにRaspbianのインストールはしないでほしいとのことだったのでインストールは行いませんでした。そのためスタート地点は違ったかもしれません・・・) mt08様のおかげで研究を進めることができそうです。誠にありがとうございました!
mt08

2017/06/12 05:15

rrsさん、 無事に動作してよかったですね。 aptが使えないということは、Raspbianがちょっと古いバージョンかもしれませんね。 あと、このトピックとは関係ないですが、ラズパイをヘビーに使ってた時期があり、SDカードの、データ破損(フォーマットすれば使える)や、ハード的破損(メモリ不良ブロックで使用不可)などのトラブルがあったので、重要なプログラムやデータのバックアップを小まめにとることをおすすめします。 再構築手順(使用したRaspbianのVersionと必要なパッケージ類のリストなど)をまとめておくと、いざというとき、すぐに復旧できてよいかと思います。
guest

0

rrsさん、

g++ sample.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`

これでどうでしょうか

エラーメッセージは、リンクエラーですね。
呼び出している関数が見つからなくて、リンクできなくて、実行ファイルが生成できない、ってやつです。
外部のライブラリを指定してあげる必要があります。

で、opencvでは、pkg-configを使うと、コンパイルに使うオプションがわかります。
--cflagsで、ヘッダの読み込みPATH、--libsでリンクするライブラリのオプションを出力してくれるので、それを使います。
単にpkg-configを実行すると、私の環境では、それぞれ、以下のように出力されました。

shell

1pi@raspberrypi:~/teratail.com-questions-79058 $ pkg-config --cflags opencv 2-I/usr/include/opencv 3pi@raspberrypi:~/teratail.com-questions-79058 $ pkg-config --libs opencv 4/usr/lib/arm-linux-gnueabihf/libopencv_calib3d.so -lopencv_calib3d /usr/lib/arm-linux-gnueabihf/libopencv_contrib.so -lopencv_contrib /usr/lib/arm-linux-gnueabihf/libopencv_core.so -lopencv_core /usr/lib/arm-linux-gnueabihf/libopencv_features2d.so -lopencv_features2d /usr/lib/arm-linux-gnueabihf/libopencv_flann.so -lopencv_flann /usr/lib/arm-linux-gnueabihf/libopencv_gpu.so -lopencv_gpu /usr/lib/arm-linux-gnueabihf/libopencv_highgui.so -lopencv_highgui /usr/lib/arm-linux-gnueabihf/libopencv_imgproc.so -lopencv_imgproc /usr/lib/arm-linux-gnueabihf/libopencv_legacy.so -lopencv_legacy /usr/lib/arm-linux-gnueabihf/libopencv_ml.so -lopencv_ml /usr/lib/arm-linux-gnueabihf/libopencv_objdetect.so -lopencv_objdetect /usr/lib/arm-linux-gnueabihf/libopencv_ocl.so -lopencv_ocl /usr/lib/arm-linux-gnueabihf/libopencv_photo.so -lopencv_photo /usr/lib/arm-linux-gnueabihf/libopencv_stitching.so -lopencv_stitching /usr/lib/arm-linux-gnueabihf/libopencv_superres.so -lopencv_superres /usr/lib/arm-linux-gnueabihf/libopencv_ts.so -lopencv_ts /usr/lib/arm-linux-gnueabihf/libopencv_video.so -lopencv_video /usr/lib/arm-linux-gnueabihf/libopencv_videostab.so -lopencv_videostab 5pi@raspberrypi:~/teratail.com-questions-79058 $

これをコピペして、
g++ sample.cpp -I/usr/include/opencv /usr/lib/arm-linux-gnueabihf/libopencv_calib3d.so -lopencv_calib3d /usr/lib/arm-linux-gnueabihf/libopencv_contrib.so -lopencv_contrib /usr/lib/arm-linux-gnueabihf/libopencv_core.so -lopencv_core /usr/lib/arm-linux-gnueabihf/libopencv_features2d.so -lopencv_features2d /usr/lib/arm-linux-gnueabihf/libopencv_flann.so -lopencv_flann /usr/lib/arm-linux-gnueabihf/libopencv_gpu.so -lopencv_gpu /usr/lib/arm-linux-gnueabihf/libopencv_highgui.so -lopencv_highgui /usr/lib/arm-linux-gnueabihf/libopencv_imgproc.so -lopencv_imgproc /usr/lib/arm-linux-gnueabihf/libopencv_legacy.so -lopencv_legacy /usr/lib/arm-linux-gnueabihf/libopencv_ml.so -lopencv_ml /usr/lib/arm-linux-gnueabihf/libopencv_objdetect.so -lopencv_objdetect /usr/lib/arm-linux-gnueabihf/libopencv_ocl.so -lopencv_ocl /usr/lib/arm-linux-gnueabihf/libopencv_photo.so -lopencv_photo /usr/lib/arm-linux-gnueabihf/libopencv_stitching.so -lopencv_stitching /usr/lib/arm-linux-gnueabihf/libopencv_superres.so -lopencv_superres /usr/lib/arm-linux-gnueabihf/libopencv_ts.so -lopencv_ts /usr/lib/arm-linux-gnueabihf/libopencv_video.so -lopencv_video /usr/lib/arm-linux-gnueabihf/libopencv_videostab.so -lopencv_videostab としてコンパイルできます。
が、シェルで、` (backquote)でくくると、その実行結果の出力をコマンドに展開して、実行してくれるので、これを使っています。

(追記)
記事を参考にして、、ということは、OpenCVのビルド・インストールは、ご自身でされたのでしょうか?
こちらでの検証は、apt-get にて、インストールしたものを使用しています。

環境

  • Raspberry Pi 2
  • Raspbian: 2017-04-10-raspbian-jessie
  • OpenCVのインストール: sudo apt-get install libopencv-dev python-opencv
  • OpenCV Version: 2.4.9.1

投稿2017/06/05 16:13

編集2017/06/05 16:33
mt08

総合スコア1825

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

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

rrs

2017/06/07 04:08

詳しいご回答ありがとうございます。 g++ sample.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv` を実行したところ、それぞれの ’ ’ 内に対し、『そのようなファイルやティレクトリはありません』といったエラーが出力されました。 また、pkg-config単体で実行したところ、『Must specify package names on the command line』というエラーメッセージが出ました。 これは、OpenCVが正しくインストールされていないということなのでしょうか…? もともとは、記事に沿った方法で自身でOpenCVのビルド・インストールをしました。 再度、sudo apt-get install libopencv-dev python-opencvを実行し、mt08様と同じ方法でインストールを行ったのですが、その後も同様のエラーが出ます… 無知なもので大変恐縮ですが、解決方法についてご教授いただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問