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

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

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

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

C++

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

Q&A

解決済

3回答

807閲覧

ラズパイ opencv 突然終了する

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

C++

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

0グッド

3クリップ

投稿2019/09/02 20:35

編集2019/09/03 09:47

現在、opencvで2値化した画像の白のピクセルの平均値を求める
プログラムを作成しています。

C++

1#include<opencv2/opencv.hpp> 2#include<iostream> 3#include<cstdio> 4#include<vector> 5 6using namespace cv; 7using namespace std; 8 9int main(){ 10 cv::VideoCapture cap(0); 11 // 様々な設定... 12 cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); 13 cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480); 14 // カメラがオープンできたかの確認 15 if(!cap.isOpened()) return -1; 16 17 cv::namedWindow("Capture", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO); 18 while (1){ 19 Mat frame,gray,thred,thred_; 20 cap >> frame; 21 cvtColor(frame,gray,CV_BGR2GRAY);//グレースケール化 22 threshold(gray,thred_,60,255,THRESH_BINARY);//2値化 23 cv::bitwise_not(thred_,thred); 24 cv::rectangle(thred, cv::Point(0,0), cv::Point(639,239), cv::Scalar(0,0,0), -1, 0);//上部の塗りつぶし 25 unsigned int total_pixel=0; 26 int pix=0,center=0; 27 for(int y=0; y <479 ;y++) { 28 for(int x=0;x<639;x++){ //ピクセル読み込み 29 if(thred.at<uchar>(y,x)==255){ 30 total_pixel = total_pixel + x; 31 pix++; 32 } 33 } 34 } 35 if(pix != 0){ 36 center = total_pixel/pix; 37 } 38 printf("%d\n",center); 39 imshow("Capture",thred); 40 if(waitKey(30) >= 0)break; 41 } 42}

macbook pro 2015で実行すると動くのですが、ラズパイ3では
一瞬ウィンドウが表示され、while(1){}の部分が一度だけ実行され、
何もエラーもなく終了してしまいます。

試したこと

・プログラムの軽量化(ループ内の処理を減らす)
・他プログラムの実行(カメラ画像を表示するもの)…可能

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

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

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

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

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

y_waiwai

2019/09/02 21:07

うまく動かないとはどうなるんでしょうか。 質問を編集して追記してください
退会済みユーザー

退会済みユーザー

2019/09/03 00:10

至急という情報は不要です。
stdio

2019/09/03 00:42

まず、原因を調べるべきです。ある程度、こうしたのに上手く動かなかったなどの情報があれば答えやすいのですが... ざっと見た感じだと、#include<opencv2/opencv.hpp>の設定パスが間違っているように思えますね。
退会済みユーザー

退会済みユーザー

2019/09/03 09:33

適当な質問で本当に申し訳ありません。 コードをmac(opencv3.3.0)で書き、ラズパイで apt-get install libopencv-dev で導入したopencvでコンパイルして実行しています。 (質問の修正もさせていただきます)
y_waiwai

2019/09/03 09:41

質問のタイトルにエラーとありますが、エラーが出るとかエラー・メッセージが出るとかないんでしょうか
退会済みユーザー

退会済みユーザー

2019/09/03 09:48

全くエラーは出ず、1ループだけで終了してしまいます。
guest

回答3

0

うまく動かない(うまく動かしたい)のならば、
(1) どう動くべきところが実際はどう動いているかを把握し、
(2) その原因を探し、
(3) 対処する
しかないでしょう。
これだけの情報だと回答者は最初のステップが動けません。
そもそも、ラズパイ3で動作するようにコンパイルしたのですか?
(macbook pro 2015で動作するようにコンパイルした(バイナリ=実行形式の)プログラムをそのままラズパイ3にコピーしてもたぶん、全く動作しないと思います)


(追記)
waitKeyがラズパイ環境では仕様どおりには動いていない可能性はあります。
waitKeyの動作を確認するためのテストプログラムを作ってテストしてみたらどうでしょう?
そしてどうやれば想定どおりの動きをするかを調べたらいいと思います。
とりあえずは人間が反応できる位の時間を指定して実行し、キーを押して(ラズパイ環境のキーってありますか?)そのキーコードが返ってきているかを確認してみたらどうでしょうか?

投稿2019/09/03 08:51

編集2019/09/03 14:19
sage

総合スコア1216

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

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

退会済みユーザー

退会済みユーザー

2019/09/03 10:00

macで作成したコードをラズパイでコンパイルしています。
sage

2019/09/03 10:24

その先のデバッグにはどう動くべきところがどう動作したかの情報が必要です。 whileを抜け出すのは最後のif文が成立したとき(とwhile内で呼び出したプログラムが異常終了したとき)くらいです。 その切り分けはできましたか?
退会済みユーザー

退会済みユーザー

2019/09/03 13:39

試しにif(waitkey(30) >=0)break;の行を消してみると すぐ止まらなくなりましたが、ウィンドウが表示されなくなりました。 GUIのライブラリなどを調べています。
退会済みユーザー

退会済みユーザー

2019/09/03 13:59

if(waitKey(30)>=0)break;を削除するとうまく動くようになりました。 なぜこうなるのでしょうか? if文で分岐しているはずなのですが、、、
guest

0

とりあえず同じソースでRPi3の上でコンパイルして動作を確認。
動きます。
恐らく環境を正しく構成できていないのでは?
OpenCVの導入をどのようにしたか?
も添えてください。

投稿2019/09/03 02:34

MasahikoHirata

総合スコア3747

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

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

退会済みユーザー

退会済みユーザー

2019/09/03 09:59

ラズパイには sudo apt-get install libopencv-dev でインストールしました。
guest

0

ベストアンサー

原因はわかりませんが,まずは以下のような作業を行って問題箇所を突き止めてみてはどうでしょうか.

(1)frameが正しくキャプチャできていることを確認する.
cap >> frame; の直後に frame.empty() を用いたチェックを入れてみる.

if( frame.emtpy() ){ 何かprintfでもする; break; }

みたいな.
(また,frameのrowsとcolsもprintfあたりで出力して,cap.set()の指定が効いているのかどうかも一度確認してみると良いかも)

(2)途中の処理が失敗しているのが原因なのか否かを確認.
whileループ内のcvtColor~printfまでを全てコメントアウトしてみる(cap >> frame;の直後がimshowになる)→それでも問題の現象が起こるのか?を確認.

他プログラムの実行(カメラ画像を表示するもの)…可能

とのことですから,この正常動作する「他のプログラム」にコードの形を徐々に近づけていけば,問題箇所がわかるのでは.

(3)ifの終了条件を満たしていないかを確認する.

if(waitKey(30) >= 0)break;

の行を,例えば,

int waitKeyRetVal = waitKey(30); if( waitKeyRetVal >= 0 ) { printf( "%d", waitKeyRetVal ); break; }

のように変えてチェックする.

投稿2019/09/05 01:51

fana

総合スコア11658

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

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

fana

2019/09/05 01:53

あと,全然関係ない話だけど,2値化してからnotを取る作業をしているけど,そこはTHRESH_BINARY_INVを使えば良いように思う.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問