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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

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

C++

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

Q&A

1回答

1432閲覧

配列についての質問です

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

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

C++

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

0グッド

0クリップ

投稿2016/11/28 11:17

###前提・実現したいこと
OpenCVを用いて卒業研究で天体に関するシステム開発を行っています。

###発生している問題・エラーメッセージ
わからないことは、おそらくプログラミングの基礎的なことだと思いますが…

下のソースコードはオリオン座の写真を二値化し、二値化した画像の白い部分の重心を取る、というものです。
一番下の「もしmodel_areaがmodel_area_min以上なら~」のところで出力させていますが、この部分をさらに配列に格納したいのですが、なかなかうまくいきません。

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

C++

1/* -------ラベリング------- */ 2 3 cv::Mat img_model, model_dst, model_dst2; //行列リソース確保 4 img_model = cv::imread("orion.jpg", 0); //img_model読込 5 if(img_model.empty()) return -1; //img_model読込不可なら終了 6 7 //二値化処理 8 int thresh = 250; 9 cv::threshold(img_model, model_dst, thresh, 255, CV_THRESH_BINARY); 10 11 //表示ウィンドウ作成 12 cv::namedWindow("img_model", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO); 13 cv::namedWindow("model_dst", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO); 14 15 //読込画像と二値化処理画像表示 16 cv::imshow("img_model", img_model); 17 cv::imshow("model_dst", model_dst); 18 19 //ラベリング処理 20 cv::Mat model_lab(model_dst.size(), CV_16SC1); 21 LabelingBS labeling; 22 labeling.Exec(model_dst.data, (short *)model_lab.data, model_dst.cols, model_dst.rows, false, 0); 23 24 //ラベル総数表示 25 std::cout<<model_dst.cols<<" "<<model_dst.rows<<std::endl; 26 std::cout<<"ラベル総数:"<< labeling.GetNumOfRegions() << std::endl; 27 28 //areaの最小値指定 29 int model_area_min = 5; 30 std::cout<<"model_area > "<< model_area_min <<" を表示"<<std::endl; 31 32 //ブロブの重心の座標格納準備 33 double model_x[labeling.GetNumOfRegions()]; 34 double model_y[labeling.GetNumOfRegions()]; 35 36 //ブロブの重心を求める 37 for(int i=1; i<labeling.GetNumOfRegions(); i++) { 38 cv::compare(model_lab, i, model_dst2, CV_CMP_EQ); 39 cv::Moments m =moments(model_dst2, true); 40 double model_area = m.m00; //面積 41 double model_x_g = m.m10 / m.m00; //重心x 42 double model_y_g = m.m01 / m.m00; //重心y 43 //重心座標格納 44 model_x[i] = model_x_g; //重心x 45 model_y[i] = model_y_g; //重心y 46 if(model_area > model_area_min) { 47 std::cout<<i<<" " <<"面積:"<< model_area << " " <<"重心x:"<< model_x_g << " " <<"重心y:"<< model_y_g << std::endl; 48 } 49 } 50 51

###試したこと
//ブロブの重心を求める のところでさらにfor文を回してみたりと試しましたが、なぜか最後のデータしか格納してくれません
ご回答、よろしくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

kpiyohiko

2016/11/28 11:44

やりたいこと(配列に入れてどうしたいのか)をもう少し具体的に記載していただけないと何をしたいのかわかりません。
guest

回答1

0

こんにちは。

なぜか最後のデータしか格納してくれません

ざっと見ただけですが、最後以外のデータも格納されそうに見えます。
最後しか格納されないことをどのようにして確認されましたか?
そのソースでは、最後のデータのみ格納されている/そうでないを確認できないと思います。

それと、for文はi=0から初めましょう。C/C++の配列は0開始です。

投稿2016/11/28 12:35

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問