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

Popular posts from this blog

php - render data via PDO::FETCH_FUNC vs loop -

c++ - OpenCV Error: Assertion failed <scn == 3 ::scn == 4> in unknown function, -

The canvas has been tainted by cross-origin data in chrome only -