質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2213閲覧

カメラ画像を9分割して処理すること

toyadai056

総合スコア34

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2017/03/17 03:26

Matを使わずIPLIMAGEでオセロを作りたいのですが、 
OpenCVでカメラから画像を取得し、その画像を縦3,横3の9マスに分けて処理が行い、 1マスごとの平均画素値を分かるようにしたいです。 
その値が 
0から60なら 0 
60から180なら1 
180から255なら2 
という値を3×3の配列に入るようにしたいです。
分からないこと 
1:1マスごとの平均画素値の求め方で画素値を合計したときに何で割ればよいのか
2:マスを左上から順に見ていくときの始まりと終わりの書き方 
3:配列にしっかりと数字が入ったのかの確認がうまくできない。
double ave=0;
int k,l;
int z[3][3];
while(1){ 
frame=cvQueryFrame(src); 
cvCvtColor(frame,imgDst,CV_RGB2GRAY);         
cvThreshold(imgDst,imgBinary,127,255,CV_THRESH_BINARY); 
for(int i=1;i<4;i++){ 
int width=0,height=0; 
for(int y=(i-1)*height/3;y<imgDst->height;y++){//2 
for(int x=(i-1)width/3;x<imgDst->width;x++){ //2
int a=imgDst->widthStep
y+x; //1
unsigned char p = 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
}
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1:1マスごとの平均画素値の求め方で画素値を合計したときに何で割ればよいのか

平均画素値 = (領域内の画素値の合計) ÷ (領域内の画素数) です。

2:マスを左上から順に見ていくときの始まりと終わりの書き方

素直に書き下すならば、3x3マス単位の2重ループを用意し、さらに各マス内の画素走査を行う2重ループ構造になります。(つまり4重ループ)

C++

1for (int block_y = 0; block_y < 3; block_y++) { 2 for (int block_x = 0; block_x < 3; block_x++) { 3 int block_left; // 位置(block_x, block_y)マスの左上X座標 を計算 4 int block_top; // 位置(block_x, block_y)マスの左上Y座標 を計算 5 int block_right; // 位置(block_x, block_y)マスの右下X座標+1 を計算 6 int block_bottom; // 位置(block_x, block_y)マスの右下Y座標+1 を計算 7 for (int y = block_top; y < block_bottom; y++) { 8 for (int x = block_left; x < block_right; x++) { 9 // 画素(x,y)にアクセス 10 } 11 } 12 } 13}

もう少しすっきりした書き方として、与えられた画像領域の平均画素値を求めるcv::meanが利用できます。同関数により内側の2重ループは不要とできます。

3:配列にしっかりと数字が入ったのかの確認がうまくできない。

質問意図を汲み取れないのですが、printfデバッグでは不十分という事でしょうか?なお、質問中のコードではあなたの期待通り動かないでしょう。


Matを使わずIPLIMAGEでオセロを作りたいのですが、

IplImageはOpenCV1.0時代の古いAPIですから、出来る限りcv::Matを使った方が良いです。今後追加される機能でIplImageをサポートすることは無いでしょう。

投稿2017/03/17 03:45

編集2017/03/17 03:56
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問