簡體   English   中英

javacv上的輪廓數不正確?

[英]Incorrect number of Contours on javacv?

我編寫了簡單的代碼來檢索圖像中的輪廓數,並獲得圖像中的輪廓數。 但它總是給出錯誤的答案。 有人可以解釋一下嗎?

 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);

     }
 } 

這是我使用的示例圖像

在此輸入圖像描述

但Code始終將輸出返回為8.請有人解釋一下嗎?

cvSeq.elem_size()將以字節為單位返回sequence元素的大小,而不是輪廓的數量。 這就是每次輸出為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將僅提供圖像中圖像邊界的外部輪廓(前提是您沒有反轉圖像)。 您可以使用CV_RETR_LIST獲取所有輪廓。 有關參數的更多信息,請訪問以下鏈接。 http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#findcontours

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM