18 for(cont=0;cont<size_contour;cont++)
30 void Opening(Mat & src, Mat & dest,
unsigned int erosion_size)
41 Mat element = getStructuringElement( MORPH_RECT,Size( 2*erosion_size + 1, 2*erosion_size+1 ),
42 cv::Point( erosion_size, erosion_size ) );
44 dilate( src, src, element );
45 erode( src, src, element );
49 void closing(Mat & src, Mat & dest,
unsigned int erosion_size)
60 Mat element = getStructuringElement( MORPH_RECT,Size( 2*erosion_size + 1, 2*erosion_size+1 ),
61 cv::Point( erosion_size, erosion_size ) );
63 erode( src, src, element );
64 dilate( src, src, element );
79 vector<vector<cv::Point> > contours;
80 vector<Vec4i> hierarchy;
84 findContours( src_tresh, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );
87 vector<vector<cv::Point> > contours_poly( contours.size() );
88 vector<Rect> boundRect( contours.size() );
89 vector<cv::Point2f>center( contours.size() );
90 vector<float>radius( contours.size() );
92 for(
unsigned i = 0; i < contours.size(); i++ )
93 { approxPolyDP( Mat(contours[i]), contours_poly[i], 3,
true );
94 boundRect[i] = boundingRect( Mat(contours_poly[i]) );
95 minEnclosingCircle( (Mat)contours_poly[i], center[i], radius[i] );
99 Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
101 for(
unsigned i = 0; i< contours.size(); i++ )
103 Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
104 drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, cv::Point() );
105 rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
106 circle( drawing, center[i], (
int)radius[i], color, 2, 8, 0 );
111 imshow(
"Contours", drawing );
127 int minHessian = 1000;
129 SurfFeatureDetector detector( minHessian );
131 std::vector<KeyPoint> keypoints_object, keypoints_scene;
133 detector.detect( img_object, keypoints_object );
134 detector.detect( img_scene, keypoints_scene );
137 SurfDescriptorExtractor extractor;
139 Mat descriptors_object, descriptors_scene;
141 extractor.compute( img_object, keypoints_object, descriptors_object );
142 extractor.compute( img_scene, keypoints_scene, descriptors_scene );
145 FlannBasedMatcher matcher;
146 std::vector< DMatch > matches;
147 matcher.match( descriptors_object, descriptors_scene, matches );
149 double max_dist = 0;
double min_dist = 100;
152 for(
int i = 0; i < descriptors_object.rows; i++ )
153 {
double dist = matches[i].distance;
154 if( dist < min_dist ) min_dist = dist;
155 if( dist > max_dist ) max_dist = dist;
162 std::vector< DMatch > good_matches;
164 for(
int i = 0; i < descriptors_object.rows; i++ )
165 {
if( matches[i].distance < 2*min_dist )
166 { good_matches.push_back( matches[i]); }
170 drawMatches( img_object, keypoints_object, img_scene, keypoints_scene,
171 good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
172 vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
175 std::vector<cv::Point2f> obj;
176 std::vector<cv::Point2f> scene;
178 for(
unsigned int i = 0; i < good_matches.size(); i++ )
181 obj.push_back( keypoints_object[ good_matches[i].queryIdx ].pt );
182 scene.push_back( keypoints_scene[ good_matches[i].trainIdx ].pt );
185 std::cout<<
"Obj "<<obj.size()<<
" scene: "<<scene.size()<<std::endl;
187 if(obj.size()>=4 && scene.size()>=4)
190 Mat H = findHomography( obj, scene, CV_RANSAC );
193 std::vector<cv::Point2f> obj_corners(4);
194 obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint( img_object.cols, 0 );
195 obj_corners[2] = cvPoint( img_object.cols, img_object.rows ); obj_corners[3] = cvPoint( 0, img_object.rows );
196 std::vector<cv::Point2f> scene_corners(4);
198 perspectiveTransform( obj_corners, scene_corners, H);
201 line( img_matches, scene_corners[0] + Point2f( img_object.cols, 0), scene_corners[1] + Point2f( img_object.cols, 0), Scalar(0, 255, 0), 4 );
202 line( img_matches, scene_corners[1] + Point2f( img_object.cols, 0), scene_corners[2] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
203 line( img_matches, scene_corners[2] + Point2f( img_object.cols, 0), scene_corners[3] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
204 line( img_matches, scene_corners[3] + Point2f( img_object.cols, 0), scene_corners[0] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
208 imshow(
"Good Matches & Object detection", img_matches );
void closing(Mat &src, Mat &dest, unsigned int erosion_size)
Morphological operation Closing.
void descritor(Mat &img_object, Mat &img_scene)
Find discriptors (Match points)
void Opening(Mat &src, Mat &dest, unsigned int erosion_size)
Morphological operation OPENING.
void boundig_box(Mat &src_tresh, Mat &threshold_output)
FIND THE BOUDING BOX.
cv::Point calculate_center_contour(cv::Point2f contour[], unsigned int size_contour)