サイズが 320x320 ピクセルのしきい値処理された画像があります。ROI を設定して、画像全体を 20x20 ピクセルのブロックでループします。各ブロックの平均値を見つける必要があります。そこで、これらの画像ブロックを関数 'cvAvg' に渡します。以下の問題に直面しています。
「cvAvg」の戻り型は「CvScalar」で、4 つの double があります。ドキュメントから CvScalar を解釈できませんでした。他の決定を下す必要があることに基づいて、おそらく「float」または「double」の形式のピクセルの平均値が1つだけ必要です。関数の戻り値から単一の値を抽出するにはどうすればよいですか。すべてのピクセルを反復して平均を求めたくありません。20x20のブロックで処理したい。例: 20x20 のブロックで 200 ピクセルが白で 200 ピクセルが黒の場合、単一の値を抽出して、ブロックに 50% の白ピクセルがあり、平均/平均を考えたと判断できるようにしたい知る良い方法でしょう。
CvScalar 型の変数を作成して、関数 'cvAvg. しかし、しきい値処理された画像のすべての値は同じです
0.000000 255.000000 0.000000 0.000000
0.000000 255.000000 0.000000 0.000000
0.000000 255.000000 0.000000 0.000000
0.000000 255.000000 0.000000 0.000000
これは、画像のすべてのブロックをループするために 256 回続きますが、しきい値処理された画像には白と黒の異なる部分があるため、正しくありませんでした。何が起きてる?以下のコード。imgGreenThresh は、緑のしきい値が設定された「バイナリ イメージ」です。
IplImage* imgDummy = cvCreateImage(cvGetSize(imgGreenThresh), 8, 1); //Create a dummy image of the same size as thresholded image
cvCopy(imgGreenThresh, imgDummy); //Copy the thresholded image for further operations
CvRect roi; //Rectangular ROI
CvSize size;
int r, c, N=20;
int count = 0;
float LaserState[16][16]; //Create 16x16 matrix to hold the laser state values.
CvScalar meanValue; // individual windows mean value
size = cvGetSize(imgDummy); //returns image ROI, in other words, height and width of matrix
//Iteratively send the different ROIs for processing.
for (r = 0; r < size.height; r += N)
for (c = 0; c < size.width; c += N)
{
count++;
roi.x = c;
roi.y = r;
roi.width = (c + N > size.width) ? (size.width - c) : N;
roi.height = (r + N > size.height) ? (size.height - r) : N;
cvSetImageROI(imgDummy, roi);
meanValue = cvAvg(imgDummy);
printf("%f\t%f\t%f\t%f\n", meanValue);
cvResetImageROI(imgDummy);
}
//cvResetImageROI(imgDummy); //Do not forget to reset ROIs
ありがとう!
スディル。