3

サイズが 320x320 ピクセルのしきい値処理された画像があります。ROI を設定して、画像全体を 20x20 ピクセルのブロックでループします。各ブロックの平均値を見つける必要があります。そこで、これらの画像ブロックを関数 'cvAvg' に渡します。以下の問題に直面しています。

  1. 「cvAvg」の戻り型は「CvScalar」で、4 つの double があります。ドキュメントから CvScalar を解釈できませんでした。他の決定を下す必要があることに基づいて、おそらく「float」または「double」の形式のピクセルの平均値が1つだけ必要です。関数の戻り値から単一の値を抽出するにはどうすればよいですか。すべてのピクセルを反復して平均を求めたくありません。20x20のブロックで処理したい。例: 20x20 のブロックで 200 ピクセルが白で 200 ピクセルが黒の場合、単一の値を抽出して、ブロックに 50% の白ピクセルがあり、平均/平均を考えたと判断できるようにしたい知る良い方法でしょう。

  2. 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

ありがとう!

スディル。

4

2 に答える 2