2012-07-09 14 views
5

मैंने छवि में कंटूर की संख्या पुनर्प्राप्त करने के लिए सरल कोड लिखा है और छवि में कंटूर की संख्या प्राप्त की है। लेकिन यह हमेशा गलत जवाब देता है। कृपया कोई इस बारे में समझा सकता है?जावैक पर कंटूर की गलत संख्या?

import com.googlecode.javacpp.Loader; 
import com.googlecode.javacv.CanvasFrame; 
import static com.googlecode.javacpp.Loader.*; 
import static com.googlecode.javacv.cpp.opencv_core.*; 
import static com.googlecode.javacv.cpp.opencv_imgproc.*; 
import static com.googlecode.javacv.cpp.opencv_highgui.*; 
import java.io.File; 
import javax.swing.JFileChooser; 

public class TestBeam { 
    public static void main(String[] args) { 
     CvMemStorage storage=CvMemStorage.create(); 
     CvSeq squares = new CvContour(); 
     squares = cvCreateSeq(0, sizeof(CvContour.class), sizeof(CvSeq.class), storage); 
     JFileChooser f=new JFileChooser(); 
     int result=f.showOpenDialog(f);//show dialog box to choose files 
      File myfile=null; 
      String path=""; 
     if(result==0){ 
      myfile=f.getSelectedFile();//selected file taken to myfile 
      path=myfile.getAbsolutePath();//get the path of the file 
     } 
     IplImage src = cvLoadImage(path);//hear path is actual path to image 
     IplImage grayImage = IplImage.create(src.width(), src.height(), IPL_DEPTH_8U, 1); 
     cvCvtColor(src, grayImage, CV_RGB2GRAY); 
     cvThreshold(grayImage, grayImage, 127, 255, CV_THRESH_BINARY); 
     CvSeq cvSeq=new CvSeq(); 
     CvMemStorage memory=CvMemStorage.create(); 
     cvFindContours(grayImage, memory, cvSeq, Loader.sizeof(CvContour.class), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); 
     System.out.println(cvSeq.elem_size()); 
     CanvasFrame cnvs=new CanvasFrame("Beam"); 
     cnvs.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 
     cnvs.showImage(src); 
     //cvShowImage("Final ", src); 

    } 
} 

यह नमूना छवि है कि मैं

enter image description here

प्रयोग किया जाता है लेकिन कोड हमेशा रिटर्न 8. के ​​रूप में उत्पादन कृपया कोई इस व्याख्या कर सकते हैं?

+0

मुझे पाइथन एपीआई का उपयोग करके इस छवि में 1 9 मिलते हैं। –

+0

@AbidRahmank क्या आपको इसके अर्थ के बारे में कोई जानकारी है? –

+1

मुझे 1 9 मिल गया क्योंकि, एक पूर्ण छवि सीमा, फिर 9 बाहरी सीमाएं और 9 वर्गों की 9 आंतरिक सीमाएं। अगर आपने छवि को उलटा कर दिया है, तो आपको 18 लगता है, क्योंकि छवि सीमा समाप्त हो जाएगी। यहां जाएं: http://opencvpython.blogspot.com/2012/06/hi-this-article-is-tutorial-which-try.html –

उत्तर

1

cvSeq.elem_size() बाइट्स में अनुक्रम तत्व का आकार लौटाएगा और समोच्चों की संख्या नहीं। यही कारण है कि उत्पादन हर बार 8 है। कृपया अधिक जानकारी के लिए निम्नलिखित लिंक देखें। http://opencv.willowgarage.com/documentation/dynamic_structures.html#cvseq

आप निम्नलिखित स्निपेट

int i = 0; 
while(cvSeq != null){ 
i = i + 1; 
cvSeq = cvSeq.h_next(); 
} 
System.out.println(i); 
मापदंडों आप CV_RETR_EXTERNAL केवल बाहरी समोच्च प्रदान करेगा प्रदान की है अपनी छवि में छवि सीमा है कि के साथ

उपयोग कर सकते हैं आकृति की संख्या को खोजने के लिए (बशर्ते आप छवि inverting नहीं कर रहे हैं)। आप सभी रूपों को प्राप्त करने के लिए CV_RETR_LIST का उपयोग कर सकते हैं। पैरामीटर पर अधिक जानकारी के लिए निम्न लिंक पर जाएं। http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#findcontours

संबंधित मुद्दे