Extracting the fingers from the hand

1.9k views Asked by At

I am using this code to *extract the finger*s when users show their hands to the camera.

The following error is being thrown after inserting these lines to find the convexity.

     if (contours[i].size() >3 )
       {
        cout<<"inside"<<endl;
        convexityDefects(contours[i], hull[i], defects[i]);
       }

And the error is :

inside OpenCV Error: Assertion failed (hull.checkVector(1, CV_32S) > 2) in convexityDefects, file C:/slave/builds/WinInstallerMegaPack/src/opencv/modules/imgproc/src/contours.cpp, line 1971

This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. terminate called after throwing an instance of 'cv::Exception' what(): C:/slave/builds/WinInstallerMegaPack/src/opencv/modules/imgproc/src/contours.cpp:1971: error: (-215) hull.checkVector(1, CV_32S) > 2 in function convexityDefects

Can anybody help me to resolve this issue?

Code:

 #include "opencv2/highgui/highgui.hpp"

 #include "opencv2/imgproc/imgproc.hpp"

 #include <iostream>

 #include <stdio.h>

 #include <stdlib.h>

 using namespace cv;
 using namespace std;

 Mat src; Mat src_gray;
 int thresh = 147;
 int max_thresh = 255;
 RNG rng(12345);

 /// Function header
 void thresh_callback(int, void* );

/** @function main */
int main( int argc, char** argv )
 {

   src = imread( "D:\\a.jpg", 1 );



   /// Convert image to gray and blur it
   resize(src,src,Size(640,480),0,0,INTER_LINEAR);
   cvtColor( src, src_gray, CV_BGR2GRAY );
   blur( src_gray, src_gray, Size(3,3) );

   /// Create Window
   char* source_window = "Knuckle Extractor";
   namedWindow( source_window, CV_WINDOW_AUTOSIZE );
   imshow( source_window, src );

//   createTrackbar( " Threshold:",  source_window, &thresh, max_thresh, thresh_callback );
   thresh_callback( 0, 0 );

   waitKey(0);
   return(0);
 }

 /** @function thresh_callback */
 void thresh_callback(int, void* )
 {
   Mat src_copy = src.clone();
   Mat threshold_output;
   vector<vector<Point> > contours;
   vector<Vec4i> hierarchy;

   /// Detect edges using Threshold
   threshold( src_gray, threshold_output, thresh, 255, THRESH_BINARY||CV_THRESH_OTSU );

  // imshow("Grey",src_gray);
   imshow("Threshold",threshold_output);

   /// Find contours
//   findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
//findContours( threshold_output, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, Point(0, 0) );
findContours( threshold_output, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

   /// Find the convex hull object for each contour
   vector<vector<Point> >hull( contours.size() );
   vector<vector<Vec4i> >defects( contours.size() );

   for( int i = 0; i < contours.size(); i++ )
        {  
         convexHull( Mat(contours[i]), hull[i], false ); 
         if (contours[i].size() >3 )
           {
            cout<<"inside"<<endl;
            convexityDefects(contours[i], hull[i], defects[i]);
           }
        }



   /// Draw contours + hull results
   Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
   for( int i = 0; i< contours.size(); i++ )
      {
        Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
        drawContours( drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
       drawContours( drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
      }

   /// Show in a window
   namedWindow( "Result", CV_WINDOW_AUTOSIZE );
   imshow( "Result", drawing );
 }
1

There are 1 answers

7
Roger Rowland On

The problem (or at least the main one I can see), is the way you construct your contours. You should use:

vector<vector<int> >hull( contours.size() );

Instead of:

vector<vector<Point> >hull( contours.size() );

This is because the convexityDefects function only works on convex hulls represented by a series of indices rather than a series of points.