2017-07-19 17 views
1

findContour/matchShape関数を使用して大きな画像でオブジェクトを検索しようとしています(オブジェクトが変わる可能性がありますので、色などを調べることはできません)私は、唯一のテンプレートが置かれているシーンを使用している場合はOpenCVs matchShapes関数を使用すると一致する問題

Mat scene = imread... 
Mat Template = imread... 
Mat imagegray1, imagegray2, imageresult1, imageresult2; 
int thresh=80; 
double ans=0, result=0; 

// Preprocess pictures 
cvtColor(scene, imagegray1,CV_BGR2GRAY); 
cvtColor(Template,imagegray2,CV_BGR2GRAY); 

GaussianBlur(imagegray1,imagegray1, Size(5,5),2); 
GaussianBlur(imagegray2,imagegray2, Size(5,5),2); 

Canny(imagegray1, imageresult1,thresh, thresh*2); 
Canny(imagegray2, imageresult2,thresh, thresh*2); 


vector<vector <Point> > contours1; 
vector<vector <Point> > contours2; 
vector<Vec4i>hierarchy1, hierarchy2; 
// Template 
findContours(imageresult2,contours2,hierarchy2,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0)); 
// Szene 
findContours(imageresult1,contours1,hierarchy1,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0)); 

imshow("template", Template); 
double helper = INT_MAX; 
int idx_i = 0, idx_j = 0; 
// Match all contours with eachother 
for(int i = 0; i < contours1.size(); i++) 
{ 
    for(int j = 0; j < contours2.size(); j++) 
    { 
     ans=matchShapes(contours1[i],contours2[j],CV_CONTOURS_MATCH_I1 ,0); 
     // find the best matching contour 
     if((ans < helper)) 
     { 
      idx_i = i; 
      helper = ans; 
     } 
    } 
} 
    // draw the best contour 

drawContours(scene, contours1, idx_i, 
Scalar(255,255,0),3,8,hierarchy1,0,Point()); 

:オブジェクトは対称型かもしれないので、また

enter image description here

は、私は次のコードを書かれている)仕事をdoesn't取得する良好なマッチング結果:コード - 私の問題は使用していただきました! enter image description here

ホープ誰かが私を伝えることができます:私はトラブル物体を検出した写真で enter image description here

しかしあるとき、複数のオブジェクト。ありがとう

答えて

1

2番目の画像(ほとんどの各文字)には、膨大な輪郭があります。スケール不変のHu-瞬間のためmatchShapeチェック(http://docs.opencv.org/3.1.0/d3/dc0/group__imgproc__shape.html#gab001db45c1f1af6cbdbe64df04c4e944)として

2nd image with contours

も非常に小さい輪郭はあなたが探している形に合わせて。

言い換えるとそれを言うために小さな領域50

if(contourArea(contours1[i]) > 50) 
    drawContours(scene, contours1, i, Scalar(255, 255, 0), 1); 

2nd image with contours larger 50

持つすべての輪郭を除いたときに見ることができるようにまた、元の形状を適切に区別されていない、問題がありませんあなたのコードで。輪郭を単にうまく検出することはできません。私はapproxCurveconvexHullを見て、このように輪郭を閉じようとすることをお勧めします。または何らかの形でCannyの使用を改善してください。

次に、先験的な知識を使って、探している輪郭のサイズ(回転の可能性もあります)を制限することができます。

+0

「間違った」ものについての回答と説明をありがとう。私は現在あなたの提案に従おうとしています – Drian

関連する問題