opencvを用いた二値画像のアクセスと座標の取得
いつもお世話になっています。
opencvを用いたプログラムを作成しています。
真ん中に大きな塗りつぶされた●が1つあるカラー画像を二値画像に変換して、●の部分のすべての座標をとりたいと考えています。(●は大きいので1ピクセルではありません。●を構成しているピクセルの座標すべてをとるといった感じです。)
今、途中まで作成したのですが間違っているところがあると考えられるので、エラーは出ないのですがプログラムが正常に動きません。このプログラム内での間違いであるとは考えられるので、間違っている部分を教えてもらえないでしょうか?
よろしくお願いします。
//元のカラー画像
IplImage* image = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
IplImage* gray_image = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
//二値画像
IplImage* niti_image = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
//座標を入れるための配列
int test_width[500];
int test_height[500];
//カラー画像ここでimage画像に大きな●を書きました。これ以降は●がimageに存在するものとして考えてくださいお願いします
cvDrawContours( image, hand_contour[0], CV_RGB (0, 0, 0), CV_RGB (0, 0, 0), -1, CV_FILLED, 8 ,cvPoint(0,0));
//グレースケールの作成
cvCvtColor(image,gray_image,CV_BGR2GRAY);
// 画像の二値化【判別分析法(大津の二値化)】
cvThreshold (gray_image, niti_image, 90, 255, CV_THRESH_BINARY);
int k = 0;
// 左上から順番に画像を見ていく
for( int y = 0; y < niti_image->height; y++){
for(int x = 0; x < niti_image->width; x++){
//もし黒色の値が入っていたら配列に座標を代入する
if(niti_image->imageData[y * niti_image->widthStep + x * niti_image->nChannels] == 0){
test_width[k] = x;
test_height[k] = y;
k++;
}//if
}
}
お礼
osamuy様 ご回答ありがとうございます。おっしゃる通り、iphoneのアプリケーションです。 当たり判定で使うCGRectIntersectsRectに指定するCGRectが、自分の意図した範囲に内容に思えて 今回質問させていただきました。 anchorPoint等の設定もあるため、できれば当たり判定で指定したCGRectをそのまま渡す事で、 その範囲を描画するような関数があれば視覚的に確認しやすいかな、と思いました。 教えていただいた関数を見てみましたが、引数がCGPointでした。 いろいろ調べているのですが、CGRectを引数に、描画するのはないような気がしてきました…。 ご存知の方いらっしゃれば教えて下さい。