c++ - How can I draw the smallest circle from the convexity defect points OpenCV -
i've been using opencv hand recognition , got code can able find contours, convex hull & defect points. i'm having trouble drawing smallest circle(just outline) defect points. know how use specific points defects points draw circle outline. btw i'm using xcode 5.1 & sorry bad english. thank you!
#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv/cvaux.h> using namespace cv; using namespace std; mat image, gray_image, blur_image, binary_image; int thresh = 90; int main( int argc, char** argv){ namedwindow("window", cv_window_autosize); image = imread("/users/jamesbond/desktop/hand.png"); cvtcolor(image, gray_image, cv_bgr2gray); medianblur(gray_image, blur_image, 11); canny(blur_image, binary_image, 90, 180, 3); vector<vector<point> > contours; vector<vec4i> hierarchy; findcontours(binary_image, contours, hierarchy, cv_retr_tree, cv_chain_approx_simple, point(0,0)); if(contours.size()>0){ vector<vector<int>>hull(contours.size()); vector<vector<vec4i>>convdef(contours.size()); vector<vector<point>>hull_points(contours.size()); vector<vector<point>> defect_points(contours.size()); for( int = 0; < contours.size(); i++ ) { convexhull( contours[i], hull[i], false ); convexitydefects( contours[i],hull[i], convdef[i]); for(int k=0;k<hull[i].size();k++) { int ind=hull[i][k]; hull_points[i].push_back(contours[i][ind]); } for(int k=0;k<convdef[i].size();k++) { int ind = convdef[i][k][2]; defect_points[i].push_back(contours[i][ind]); circle(image,contours[i][ind],5,scalar(255,0,0),-1); drawcontours( image, contours, i, scalar(255,0,255), 2, 8, vector<vec4i>(), 0, point()); drawcontours( image, hull_points, i, scalar(255,255,0), 2, 8, vector<vec4i>(), 0, point()); } } imshow("window", image); waitkey(0); } }
have not tested it, should like:
// collect defects: // for(int k=0;k<convdef[i].size();k++) { int ind = convdef[i][k][2]; defect_points[i].push_back(contours[i][ind]); circle(image,contours[i][ind],5,scalar(255,0,0),-1); drawcontours( image, contours, i, scalar(255,0,255), 2, 8, vector<vec4i>(), 0, point()); drawcontours( image, hull_points, i, scalar(255,255,0), 2, 8, vector<vec4i>(), 0, point()); } // draw smallest circle around defects: // point center; float radius; minenclosingcircle( defect_points, center, radius ); circle(image,center,radius,scalar(255,0,0),3);
Comments
Post a Comment