###前提・実現したいこと
objective-cでカメラから取得した画像に対してテンプレートマッチングしようとしています。
テンプレートマッチングをした結果が正しくありません。
iphoneのカメラから取得したUIImage型の画像(uii_src_img)を受け取ってIPlimageに変換した後、
テンプレートマッチングを行い、再度UIImageに変換して返すコードを書きました。
途中で処理を早くするために入力画像のサイズを0.2倍にしています。
正しくテンプレートマッチングを行い、結果画像を戻したいです。
###発生している問題・エラーメッセージ
エラー無く動作しましたが、テンプレートマッチングの結果が常に0になってしまっています。
テンプレートマッチングの結果画像のdst_imgが全て0から変わりません。
opencvが動くかを試す為に、グレースケールをして戻すような処理はできていたので、テンプレートマッチングの部分がおかしいのかと思っています。
UIImageとIplimageの相互変換は表示して確かめたところ問題ないかと思います。
テンプレート画像のtmp.pngの読み込みも、表示して確認しました。
テンプレートマッチングに用いるipl_src_img, ipl_tmp_imgも表示して確かめてみました。
思い当たることは試したのですが、テンプレートマッチングが正しく動作しない理由がわかりませんでした。
###ソースコード
- (UIImage*)opencv:(UIImage*)uii_src_img { double min_val, max_val; CvPoint min_loc, max_loc; CvSize dst_size; IplImage *ipl_src_img, *ipl_tmp_img, *dst_img, *resize_ipl_src_img; uii_tmp_img = [UIImage imageNamed:@"tmp.png"]; ipl_src_img = [self createIplImageFromUIImage : uii_src_img]; ipl_tmp_img = [self createIplImageFromUIImage : uii_tmp_img]; resize_ipl_src_img = cvCreateImage(cvSize(ipl_src_img->width * 0.2, ipl_src_img->height * 0.2), IPL_DEPTH_8U, 3); cvResize(ipl_src_img, resize_ipl_src_img); dst_size = cvSize (resize_ipl_src_img->width - ipl_tmp_img->width + 1, resize_ipl_src_img->height - ipl_tmp_img->height + 1); dst_img = cvCreateImage (dst_size, IPL_DEPTH_32F, 1); // (1)探索画像全体に対して,テンプレートのマッチング値(指定した手法に依存)を計算 cvMatchTemplate(resize_ipl_src_img, ipl_tmp_img, dst_img, CV_TM_CCOEFF_NORMED); cvMinMaxLoc (dst_img, &min_val, &max_val, &min_loc, &max_loc, NULL); max_loc.x /= 0.2; max_loc.y /= 0.2; // (2)テンプレートに対応する位置に矩形を描画 cvRectangle (ipl_src_img, max_loc, cvPoint (max_loc.x + ipl_tmp_img->width, max_loc.y + ipl_tmp_img->height), CV_RGB (255, 0, 0), 3); uii_src_img = [self UIImageFromIplImage:ipl_src_img]; cvReleaseImage (&ipl_src_img); cvReleaseImage (&resize_ipl_src_img); cvReleaseImage (&ipl_tmp_img); cvReleaseImage (&dst_img); return uii_src_img; }
###補足情報
テンプレートマッチングはこちらを参考にしました。
opencv.jp - OpenCV:マッチング
UIImageとiplimageの相互変換はこちらをそのまま使っています
Qiita UIImageとIplImageの相互変換
よろしくお願いします。
###解決
テンプレートに真っ黒、真っ白のものを利用していましたが、スクリーンショットを切り抜いたような画像を使うと正常にマッチングが行われました。
指摘にあった、縮小時の四角の位置が正しくないことについて。
テンプレートを縮小していない今回の場合は、表示される四角の大きさをサーチ画像を縮小した分だけ大きくしてあげる必要がりました。
cvRectangle (ipl_src_img, max_loc,cvPoint (max_loc.x + ipl_tmp_img->width / 0.2, max_loc.y + ipl_tmp_img->height / 0.2), CV_RGB (255, 0, 0), 3);
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/12 01:36
2016/01/12 01:53
2016/01/12 02:08
2016/01/13 02:37
2016/01/13 03:53 編集
2016/01/13 03:51