2014-05-20 58 views
4

我試圖創建一個代碼,它應該在最後識別圖片中的某個圖案/形狀。使用JavaCV在圖像中檢測圖案

我試圖在圖片上繪製圖形(本例中爲「Output3」)時遇到了一些麻煩。該程序似乎不會結束。我認爲while函數有一個無限循環。 程序不顯示output3。有什麼問題?

INPUT圖像:

enter image description here

OUTPUT2圖像:

enter image description here


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 && !contours.isNull()) { 
     if(contours.elem_size() > 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); 
} 

我的目標是拍攝照片,發送到它應該會返回程序:

  • 這是一個方形
  • 這是矩形
  • 這是一個圓
  • 這是一個六邊形

回答

0

我不使用JavaCV,但這裏是我會做什麼:

  1. Conversio n灰度級,或甚至更好的二進制圖像(因爲背景是白色的)
  2. 連接組件標籤以分隔每個形狀
  3. 使用形狀索引來分類形狀。在我的博士學位期間,我使用形狀索引來區分矩形,圓盤,三角形和平行四邊形。你只需要採取一些措施來區分正方形和矩形,或者從六邊形區分磁盤。