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

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

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

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

C++

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

Q&A

解決済

1回答

3206閲覧

カメラ画像を9分割して処理したい

toyadai056

総合スコア34

OpenCV

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

C++

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

0グッド

0クリップ

投稿2017/03/16 04:08

編集2017/03/16 05:28

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

ベストアンサー

回答の前に、今後は「質問テンプレの中にソースコードを貼り付けるための作法が記述されている」ことに注意なされることをおすすめします。

それでは回答ですが、まずは自分が書かれたコードをよく読んでみましょう。

  • cvQueryFrameでフレームを取得
  • cvCvtColorでグレースケールに変換
  • cvThresholdでモノクロ画像に変換
  • 後はforループで画像の各ピクセルを読み取る

ここで疑問なのが、なぜモノクロ画像に変換したかということです。
処理の都合上必要ならともかく、
「グレースケール→モノクロ→平均値を取るので実質グレースケール処理」
というのは明らかに無駄な処理だと思われます。
また、「画像を縦3,横3の9マスに分けて処理が行い」する際に

for(int i=1;i<4;i++){ // (中略) for(int y=(i-1)*height/3;y<imgDst->height;y++){ // (中略) for(int x=(i-1)*width/3;x<imgDst->width;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の大きさにリサイズ
  • そこから各画素の値を取得

すれば、平均値を計算するコードを自分で書かずに済みます。

投稿2017/04/02 15:00

YSRKEN

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問