質問: 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 } }
回答: 回答の前に、今後は「質問テンプレの中にソースコードを貼り付けるための作法が記述されている」ことに注意なされることをおすすめします。 それでは回答ですが、まずは自分が書かれたコードをよく読んでみましょう。 * cvQueryFrameでフレームを取得 * cvCvtColorでグレースケールに変換 * cvThresholdでモノクロ画像に変換 * 後はforループで画像の各ピクセルを読み取る ここで疑問なのが、**なぜモノクロ画像に変換したか**ということです。 処理の都合上必要ならともかく、 「グレースケール→モノクロ→平均値を取るので実質グレースケール処理」 というのは明らかに無駄な処理だと思われます。 また、「画像を縦3,横3の9マスに分けて処理が行い」する際に ``` for(int i=1;i<4;i++){ // (中略) for(int y=(i-1)*height/3;yheight;y++){ // (中略) for(int x=(i-1)*width/3;xwidth;x++){ int a=imgDst->widthStep*y+x; //1 unsigned char p = imgDst->imageData[a];//1 // (後略) ``` と書かれていますが、恐らく次のように書かれると意図した通りに動作すると思われます。 (※端数を考えるのが面倒なのであえて端数処理していない) ``` const auto wx = imgDst->width; const auto wy = imgDst->height; const auto bx = wx / 3; const auto by = wy / 3; for(size_t j = 0; j < 3; ++j){ for(size_t i = 0; i < 3; ++i){ for(size_t y = 0; y < by; ++y){ for(size_t x = 0; x < bx; ++x){ const auto px = x + i * bx; const auto py = y + j * by; const size_t index = imgDst->widthStep * py + px; const auto clr = imgDst->imageData[index]; // (後略) ``` 更に、OpenCVには画像をリサイズする関数がありますので、 * cvQueryFrameでフレームを取得 * cvCvtColorでグレースケールに変換 * cvThresholdでモノクロ画像に変換 * 3x3の大きさにリサイズ * そこから各画素の値を取得 すれば、平均値を計算するコードを自分で書かずに済みます。