###前提・実現したいこと
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/ツール等のバージョンなど)