質問: imgDst->imageData[a];//1 ave=ave+imgDst->imageData[a]; //1 if(ave < 80){//3 z[i-1][i-1]=0;//3 }else if(80 <= ave && ave <= 160){//3 z[i-1][i-1]=1;//3 }else if(ave > 160){//3 z[i-1][i-1]=2;//3 } } for(k=0;k<3;k++){//3 for(l=0;l<3;l++){//3 printf("%d\n",z[l][k]);//3 } }
回答: > > 1:1マスごとの平均画素値の求め方で画素値を合計したときに何で割ればよいのか > > > 平均画素値 = (領域内の画素値の合計) ÷ (領域内の画素数) です。 > > 2:マスを左上から順に見ていくときの始まりと終わりの書き方 > > > 素直に書き下すならば、3x3マス単位の2重ループを用意し、さらに各マス内の画素走査を行う2重ループ構造になります。(つまり4重ループ) ``` for (int block_y = 0; block_y < 3; block_y++) { for (int block_x = 0; block_x < 3; block_x++) { int block_left; // 位置(block_x, block_y)マスの左上X座標 を計算 int block_top; // 位置(block_x, block_y)マスの左上Y座標 を計算 int block_right; // 位置(block_x, block_y)マスの右下X座標+1 を計算 int block_bottom; // 位置(block_x, block_y)マスの右下Y座標+1 を計算 for (int y = block_top; y < block_bottom; y++) { for (int x = block_left; x < block_right; x++) { // 画素(x,y)にアクセス } } } } ``` もう少しすっきりした書き方として、与えられた画像領域の平均画素値を求める`cv::mean`が利用できます。同関数により内側の2重ループは不要とできます。 > > 3:配列にしっかりと数字が入ったのかの確認がうまくできない。 > > > 質問意図を汲み取れないのですが、printfデバッグでは不十分という事でしょうか?なお、質問中のコードではあなたの期待通り動かないでしょう。 > > Matを使わずIPLIMAGEでオセロを作りたいのですが、 > > > `IplImage`はOpenCV1.0時代の古いAPIですから、出来る限り`cv::Mat`を使った方が良いです。今後追加される機能で`IplImage`をサポートすることは無いでしょう。