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

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

ただいまの
回答率

90.12%

Raspberry piでOpenCVを利用したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,107

rrs

score 5

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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'

  2. パッケージ更新後、再起動するので、ターミナルを開いて、以下を実行して確認。
    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:~ $

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

# 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 15:35 編集

    ご回答ありがとうございます。

    1.を実行したのですが、こちらで下記のエラーメッセージが出ました。
    sh: 1: apt: not found

    エラー内容について調べてみたのですが、良く理解できず…
    解決方法について教えて頂けると幸いです。
    何度も面倒な質問をしてしまい大変申し訳ございません。

    キャンセル

  • 2017/06/07 15: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へ書き込みする方法はわかりますか?)

    使ってるモノの、スタート地点から違うと、話が合わなくなってしまうと思うので、確認してみてください。

    キャンセル

  • 2017/06/12 12:16

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

    キャンセル

  • 2017/06/12 14:15

    rrsさん、

    無事に動作してよかったですね。
    aptが使えないということは、Raspbianがちょっと古いバージョンかもしれませんね。

    あと、このトピックとは関係ないですが、ラズパイをヘビーに使ってた時期があり、SDカードの、データ破損(フォーマットすれば使える)や、ハード的破損(メモリ不良ブロックで使用不可)などのトラブルがあったので、重要なプログラムやデータのバックアップを小まめにとることをおすすめします。

    再構築手順(使用したRaspbianのVersionと必要なパッケージ類のリストなど)をまとめておくと、いざというとき、すぐに復旧できてよいかと思います。

    キャンセル

0

rrsさん、

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


これでどうでしょうか

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

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

pi@raspberrypi:~/teratail.com-questions-79058 $ pkg-config --cflags opencv
-I/usr/include/opencv 
pi@raspberrypi:~/teratail.com-questions-79058 $ pkg-config --libs 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 
pi@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/07 13: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様と同じ方法でインストールを行ったのですが、その後も同様のエラーが出ます…

    無知なもので大変恐縮ですが、解決方法についてご教授いただけると幸いです。

    キャンセル

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る