oepncvで、テンプレートマッチングをしています。
上のサイトを参考にしているのですが、エラーが出てきました。
やりたいことは、引用サイトと同様に、ワークを回転させて何度傾いているか判断したいです。
また、引用サイトと異なり、長い長方形を回転させるのではなく、50*97の長方形を回転させたいと考えています。
よろしくお願い致します。
using namespace cv; using namespace std; //RANE_WIDTHは各レーンの幅を表します. #define RANE_WIDTH 50 int main() { Mat tmpl=imread("temp_up.bmp"); Mat screws=imread("result_0381.bmp"); double maxVal=0; //3本のレーンがあるので3回、iでループを回しています. int roi_x=215; //各レーンの位置を決めます. レーンを矩形とした時の左上の点のx座標をここで指定します. //レーンを切り出す処理です. Rectは切り出す位置のx座標、y座標、幅、高さを順に引数に取ります. //screws.rowsと書くことでscrew[Mat型]の高さを取得できます. Rect roi_rect = Rect(roi_x,53,50,97); Mat single_screw(screws.clone(),roi_rect); //実際の切り出し処理の部分 rectangle(screws, roi_rect, Scalar(0,0,255), 1); //レーンの領域に矩形を描画(赤) //これから回転させるので、回転しても、はみ出ないように広いMatの中央に切り出したレーン画像をコピーする. Mat single_screw_large = Mat::zeros(screws.rows, screws.rows, CV_8UC3); //空のMatを用意する. 縦横ともに、レーンの高さと同じ. Rect copy_rect = Rect(215,53,RANE_WIDTH,97); //コピー先のROIの指定 single_screw.copyTo(single_screw_large(copy_rect)); //コピー処理 imshow("single_screw_large", single_screw_large); //切り出した回転前のレーンを表示 //1度ずつ回転させるときに、どの角度で最もマッチしたかを保持するための変数 int max_angle=-1; double maxVal_global=-1; //テンプレートマッチング for(int angle=-180;angle<180;angle+=1) { Mat rot_single_screw; float scale = 1.0; // 中心:画像中心 cv::Point2f center(single_screw_large.cols*0.5, single_screw_large.rows*0.5); // 2次元の回転行列を計算 const cv::Mat affine_matrix = cv::getRotationMatrix2D( center, angle, scale ); warpAffine(single_screw_large, rot_single_screw, affine_matrix, single_screw_large.size()); Mat result_img; matchTemplate(rot_single_screw,tmpl,result_img, CV_TM_CCOEFF_NORMED); Point max_pt; minMaxLoc(result_img, NULL, &maxVal, NULL, &max_pt); //マッチした場所に矩形を描画 Rect roi_rect2(0, 0, tmpl.cols, tmpl.rows); roi_rect2.x = max_pt.x; roi_rect2.y = max_pt.y; rectangle(rot_single_screw, roi_rect2, Scalar(0,0,255*maxVal), 1); imshow("rot_single_screw", rot_single_screw); imshow("result_img", result_img); if(maxVal>maxVal_global) { maxVal_global=maxVal; max_angle=angle; } waitKey(1); } printf("角度=%lf\n",maxVal); return 0; }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/06 03:28