gpt4 book ai didi

javacv:在 Java 中迭代 CvSeq

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:51 25 4
gpt4 key购买 nike

我使用:


cvFindContours(gray, mem, contours, Loader.sizeof(CvContour.class) , CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));


因此我有 CvSeq 轮廓 可以迭代(据我所知)。
所以我这样使用它:

if(contours!=null) {
for (ptr = contours; ptr != null; ptr = ptr.h_next()) {
//..do sth with ptr
}
}

它有效,但有时(经常)我得到:

Exception in thread "Thread-3" java.lang.NullPointerException: This pointer address is NULL.
at com.googlecode.javacv.cpp.opencv_core$CvSeq.h_next(Native Method)
at pl..filter(FullFilter.java:69)
at pl..Window$1.run(Window.java:41)
at java.lang.Thread.run(Unknown Source)


抛出异常的那一行是ptr.h_next()的那一行。
我尝试检查空值,但它不起作用:

System.out.println("PTR="+ptr); // it's not null here!
if(ptr.h_next()==null) //exception in this line!
System.out.println("NULL");
System.out.println(ptr.h_next());

第一行显示: PTR=com.googlecode.javacv.cpp.opencv_core$CvSeq[address=0x0,position=0,limit=1,capacity=1,deallocator=com.googlecode.javacpp.Pointer$NativeDeallocator@66d53ea4]

我也试过调用 contours.total() 但它总是抛出相同的异常。
那么,在 Java 中使用类似 C 的序列的正确方法是什么?

编辑:我的完整方法:

    public IplImage filter(IplImage image) {
IplConvKernel kernel = cvCreateStructuringElementEx(2,2,1,1,CV_SHAPE_RECT, null);
cvDilate(image, image, kernel, 1);
kernel = cvCreateStructuringElementEx(5,5,2,2,CV_SHAPE_RECT, null);
cvErode(image, image, kernel, 1);
IplImage resultImage = cvCloneImage(image);
IplImage gray = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
cvCvtColor(image, gray, CV_BGR2GRAY);
CvMemStorage mem = CvMemStorage.create();
CvSeq contours = new CvSeq();
CvSeq ptr = new CvSeq();
cvThreshold(gray, gray, 20, 255, opencv_imgproc.CV_THRESH_BINARY);
double thresh = 20;
Canny( gray, gray, thresh, thresh*2, 3 ,true);
cvFindContours(gray, mem, contours, Loader.sizeof(CvContour.class) , CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

int i=0;
CvRect boundbox;
if(contours!=null) {
for (ptr = contours; ptr != null; ptr = ptr.h_next()) { //EXCEPTION HERE!
System.out.println((i++)+"\t"+ptr);
cvDrawContours( resultImage, ptr, CvScalar.BLUE, CvScalar.RED, -1, 3, 8, cvPoint(0,0) );
System.out.println("PTR="+ptr);
}

}
return resultImage;
}

它在一段时间内工作正常,但突然(可能是在找不到轮廓时?)它以以下异常结束:

Exception in thread "Thread-3" java.lang.NullPointerException: This pointer address is NULL.
at com.googlecode.javacv.cpp.opencv_core$CvSeq.h_next(Native Method)
at pl.kasprowski.eyetracker.FullFilter2.filter(FullFilter2.java:39)
at pl.kasprowski.eyetracker.Window$1.run(Window.java:42)
at java.lang.Thread.run(Unknown Source)

我直接用从相机拍摄的图像(每秒一次)提供方法。

编辑:

经过一些实验后,当我如上所述调用 cvFindContours 时,我会不时得到一个 contour 对象,它不是 NULL 但调用任何方法,如 contour.h_next()contour.total() 导致上述异常。有什么问题?或者 - 如何检查 contour 对象是否正常?!我当然可以捕获 NullPointerException 但我认为这不是解决问题的正确方法...

最佳答案

问题解决了。
我添加了附加条件。而不是:

if(contours!=null) {

我写了

if(contours!=null && !contours.isNull()) {

并且有效。我不明白为什么它是必要的,但我认为它与 Java <-> C 语义差距有关。

关于javacv:在 Java 中迭代 CvSeq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20115924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com