title: Pattern detection in an image with JavaCV
body: <p>I'm trying to create a code which should at the end recognize some pattern/shape in a picture.</p>
  
  <p>I've had some trouble when I tried to draw the shape on the pic ("Output3" in this case).
  The program seems not to end.  I think there is a infinite loop with the while function.
  The program doesn't display the output3.  What's the issue?</p>
  
  <p><strong>INPUT image:</strong></p>
  
  <p><img src="https://i.stack.imgur.com/fQPSm.jpg" alt="enter image description here"></p>
  
  <p><strong>OUTPUT2 image:</strong></p>
  
  <p><img src="https://i.stack.imgur.com/d6SiM.jpg" alt="enter image description here"></p>
  
  <hr>
  
  <pre><code>public class Hello {
  
  /**
   * @param args
   * @throws IOException 
   */
  
  public static void main(String[] args) throws IOException {
      // TODO Auto-generated method stub
  
      // Memory storage
      CvMemStorage memory = CvMemStorage.create();
      CvSeq contours = new CvSeq(null);
  
      // Display original contour image .png, then GRAYSCALE and display in CanvasFrame
      IplImage image = cvLoadImage("contour.jpg", CV_LOAD_IMAGE_GRAYSCALE);   
      CanvasFrame canvas = new CanvasFrame("Output", 1);
      CanvasFrame canvas2 = new CanvasFrame("Output2", 1);
      CanvasFrame canvas3 = new CanvasFrame("Output3", 1);
      canvas.showImage(image);
  
      // thresholding
      cvSmooth(image, image, CV_BLUR, 9 , 9, 2, 2);
      cvThreshold(image, image, 155, 255, CV_THRESH_BINARY);
  
      cvCanny(image, image, 20*7*7, 40*7*7, 7);
      cvDilate(image, image, null, 1);
  
  
      canvas2.showImage(image);
      cvSaveImage("output2.jpg", image);
  
      // finding contours
      cvFindContours(image, memory, contours, Loader.sizeof(CvContour.class), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
  
      while(contours != null &amp;&amp; !contours.isNull()) {
          if(contours.elem_size() &gt; 0) {
              CvSeq approx = cvApproxPoly(contours, Loader.sizeof(CvContour.class), memory, CV_POLY_APPROX_DP, (int) cvContourPerimeter(contours)*0.02, 0);
              cvDrawContours(image, approx, CvScalar.BLUE, CvScalar.BLUE, -1,1, CV_AA);
          }
          contours.h_next();
      }
  
      canvas3.showImage(image);
  }
  </code></pre>
  
  <p>My goal is to take a photo, send it to the program which should return: </p>
  
  <ul>
  <li>This is a square</li>
  <li>This is a rectangle</li>
  <li>This is a circle</li>
  <li>This is an hexagon</li>
  </ul>