title: Circle and hand detection in OpenCV
body: <p>Beginner here. I'm trying to detect a circle and hand, and draw a circle around the circle and a rectangle around the hand, and display both in the same image. When I run the program I get some memory error, can anyone please help? </p>
  
  <p>Below is my code:</p>
  
  <pre><code>#include "opencv/cv.h"
  #include "opencv2\highgui\highgui.hpp"
  #include &lt;iostream&gt;
  #include &lt;stdio.h&gt;
  #include &lt;math.h&gt;
  #include &lt;string.h&gt;
  #include &lt;conio.h&gt;
  
  using namespace std;
  
  //declarations
  IplImage* img = 0;
  
  CvHaarClassifierCascade *cascade;
  CvMemStorage *cstorage;
  CvMemStorage *hstorage;
  
  void detectObjects( IplImage *img );
  int key;
  
  int main( int argc, char** argv )
  {
  CvCapture *capture;
  IplImage *frame;
  
  // loads classifier for hand haar cascade
  char *filename = "haarcascade_hand.xml";
  cascade = ( CvHaarClassifierCascade* )cvLoad( "haarcascade_hand.xml", 0, 0, 0 );
  
  // setup memory buffer
  hstorage = cvCreateMemStorage( 0 );
  cstorage = cvCreateMemStorage( 0 );
  
  // initialize camera
  capture = cvCaptureFromCAM( 0 );
  
  // always check
  //assert( cascade &amp;&amp; storage &amp;&amp; capture );
  
  // create a window
  cvNamedWindow( "Camera", 1 );
  
  while(key!='q') {
      // captures frame and check every frame
      frame = cvQueryFrame( capture );
      if( !frame ) break;
  
      // detect objects and display video
      detectObjects (frame );
  
      // quit if user press 'q'
      key = cvWaitKey( 10 );
  }
  
  // free memory
  cvReleaseCapture( &amp;capture );
  cvDestroyAllWindows();
  cvReleaseHaarClassifierCascade( &amp;cascade );
  cvReleaseMemStorage( &amp;cstorage );
  cvReleaseMemStorage( &amp;hstorage );
  
  return 0;
  }
  
  void detectObjects( IplImage *img )
  {
  int px;
  int py;
  int edge_thresh = 1;
  IplImage *gray = cvCreateImage( cvSize(640,480), 8, 1 );
  IplImage *edge = cvCreateImage( cvSize(640,480), 8, 1 );
  
  // convert video image color
  cvCvtColor(img,gray,CV_BGR2GRAY);                       
  
  // set the converted image's origin
  gray-&gt;origin=1;                         
  
  // color threshold
  cvThreshold(gray,gray,100,255,CV_THRESH_BINARY);    
  
  // smooths out image
  cvSmooth(gray, gray, CV_GAUSSIAN, 11, 11);
  
  // get edges
  cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 5); 
  
  // detects circle
  CvSeq* circle =  cvHoughCircles(gray, cstorage, CV_HOUGH_GRADIENT, 1, gray-&gt;height/50, 5, 35);
  
  // draws circle and its centerpoint
  float* p = (float*)cvGetSeqElem( circle, 0 );
  cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(255,0,0), -1, 8, 0 );
  cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(200,0,0), 1, 8, 0 );
  px=cvRound(p[0]); 
  py=cvRound(p[1]);
  
  // displays coordinates of circle's center
  cout &lt;&lt;"(x,y) -&gt; ("&lt;&lt;px&lt;&lt;","&lt;&lt;py&lt;&lt;")"&lt;&lt;endl;
  
  // detects hand
  CvSeq *hand = cvHaarDetectObjects(img, cascade, hstorage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(100, 100));
  
  // draws red box around hand when detected
  CvRect *r = ( CvRect* )cvGetSeqElem( hand, 0 );
  cvRectangle( img,
      cvPoint( r-&gt;x, r-&gt;y ),
      cvPoint( r-&gt;x + r-&gt;width, r-&gt;y + r-&gt;height ),
      CV_RGB( 255, 0, 0 ), 1, 8, 0 );
  
  cvShowImage("Camera",img);
  }
  </code></pre>