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

これは私が使用したサンプル画像です

ここに画像の説明を入力してください

しかし、コードは常に出力を8として返します。誰かがこれを説明できますか?

4

1 に答える 1

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 は、画像の画像境界である外部輪郭のみを提供します (画像を反転していない場合)。CV_RETR_LIST を使用して、すべての輪郭を取得できます。パラメータの詳細については、次のリンクを参照してください。 http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#findcontours

于 2012-07-17T15:20:02.057 に答える