前提・実現したいこと
CV_32SC2型のMat(以下img)を取り扱うプログラムになります。
imgの1チャネル目には0~PROJ_WIDTHPROJ_HEIGHTの画素値が重複ありで格納されています。(PROJ_WIDTHPROJ_HEIGHTは200万ほどです。)
ただし、画素値が重複する画素同士は必ず隣接しています。
このようなsrcにおいて画素値が同じ領域の重心座標を計算し、2チャネル目に重心座標に相当する画素に目印となる値を格納するようなプログラムを考えています。
愚直に記述すると下記のような形になると思うのですが、for文が3重になっていたりと複雑なコードになってしまいます。
もっとシンプルな形で記述をしたいためアドバイスをお願いします。
初心者のため読みにくいコードだと思いますがよろしくお願いいたします。
###試したこと
for (int y = 0;y < CAMERA_HEIGHT;y++)
for (int x = 0;x < CAMERA_WIDTH;x++)
の2重ループの部分を簡略化するために、「指定した画素値をもつピクセルの総数を返す関数」、「指定した画素値をもつピクセルの座標を返す関数」のようなものがあれば簡略化できると思い探してみたのですが見つけることができませんでした。もし、そのような関数があるのでしたら教えていただきたいです。
該当のソースコード
読みやすいように一部省略しています。
C++
1//Mat imgはあらかじめ用意してあります。 2 for (int proj_index = 0;proj_index < PROJ_HEIGHT * PROJ_WIDTH;proj_index++) 3 { 4 double sum_x = 0; 5 double sum_y = 0; 6 double ave_x = 0; 7 double ave_y = 0; 8 int count = 0; 9 10 for (int y = 0;y < CAMERA_HEIGHT;y++) 11 { 12 for (int x = 0;x < CAMERA_WIDTH;x++) 13 { 14 if (img.data[y*CAMERA_WIDTH+x*img.channels()] == proj_index) 15 { 16 sum_x += x; 17 sum_y += y; 18 count++; 19 } 20 ave_x = round(sum_x / count); 21 ave_y = round(sum_y / count); 22 img.at<int[2]>(ave_y, ave_x)[1] = proj_index; 23 } 24 } 25 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/07 02:21
2021/01/07 02:29
2021/01/07 08:15