- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用:
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/
尝试使用 JAVACV 库从网络摄像头捕获。但它会抛出一个 UnsatisfiedLinkError。堆栈轨迹如下: Exception in thread "main" java.lang.Unsa
尝试使用 JavaCV 进行图像处理以根据其 Exif 数据旋转图像。从文件读取和写入 Mat 或 IplImage 是可行的,但由于正在上传或下载文件,我也希望能够做同样的事情来处理 byte[]
我正在尝试实现使用 JavaCv Surf 的示例。我下载了示例代码、.jar 文件并安装了官方网页要求的所有内容 (http://code.google.com/p/javacv/)。但似乎缺少一个
我正在开发一个使用 Java 的应用程序,该应用程序可以纠正透视(也称为梯形校正)。为此,我使用 Bytedeco's JavaCV 。引用documentations和其他几个websites和在线
我是 JavaCV/OpenCV 的新手,所以如果我是一个完全的白痴,请提前道歉...... 我需要检测图像中的“主要/主要”人脸(此图像大部分是“个人资料图片”),人脸识别 不需要。 由于不同haa
我想通过 Java 轻松捕获我的网络摄像头。我按照本教程使用 JavaCV 和 OpenCV:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/o
我在使用 JavaCV 时遇到问题。 我下载了javaCV-bin 我在 ubuntu 上的引用库中的项目中添加了 .jar 文件 我可以使用位于下载文件中的示例代码 但是错误是 Exception
我正在尝试使用 JavaCV 在我的照片数据库中实现人脸识别。虽然检测可能的面孔工作正常(已经有很多 Java 示例),但我仍然坚持进行实际识别。更准确地说,是训练人脸识别器。 出于测试目的,我有一个
我正在尝试使用 JavaCV 实现使用 ORB 算法的图像识别。根据一些论文[1] , [2] ,ORB关键点描述符是一个二进制字符串。那么,如何在获取图像的关键点后得到这个二进制字符串呢? 这是我获
我对 JavaCV FFmpegFrameRecorder 的使用有点困惑。我有几个 byte[] 或 short[] 数组(取决于我的图像是 8 位还是 16 位)是否有与多个图像相关的数据。现在,
我正在尝试使用 Java 从相机获取一些图像,但我遇到了一些问题;任何帮助将不胜感激! 代码如下: 错误日志: Exception in thread "main" java.
以下 JavaCV 代码有什么问题?我尝试填充 CvSeq 以进行进一步的工作,但 JVM 几乎 在不同位置可靠地崩溃,并出现 EXCEPTION_ACCESS_VIOLATION,最常见的是 [ms
我正在尝试过滤掉图像中的轮廓。我的代码没有语法错误,但当我运行程序时,我只是得到很多红色文本。我已定位故障点为cvInRangeS。 cvInRangeS(imghsv,minc,maxc,imgbi
我刚刚找到了一个很好的 JavaCV 示例,它使用 FFmpegFrameGrabber为应该“快”的Linux制作屏幕截图代码: try { int x = 0, y = 0, w = 13
我正在尝试使用 HoughCircles 的 JavaCV 实现方法,但我在参数方面遇到了一些问题。这是我的代码: Mat currentImageGray = tgtFrag.getImage().
我正在尝试使用 FFmpegFrameRecorder 从一组图像中制作一个视频 .mp4 文件作为更大程序的一部分,因此我设置了一个测试项目,在其中尝试制作一个25fps 的同一帧的 100 个实例
我想不断捕捉网络摄像头并让它在 Canvas 上查看。图像的保存很好。它每秒拍摄一张照片。但是 canvas.showImage() 不起作用。我的屏幕仍然空白。控制台在每一帧都显示“清理相机”。 头
我从昨天开始用 android 做 javacv,在使用 FFmpegFrameRecorder 或 FrameRecorder 从图像 (IplImage) 生成视频时出错,同时在使用 cvCvtC
我在我的项目中使用 javaCV 信封,当我尝试使用 cvLoad 函数从 xml (haarcascade_frontalface_default.xml) 加载 Haar 级联时,我从中得到 nu
我在使用 JavaCV 实现的这个项目中遇到了问题。我想至少找到二值图像中最顶部、最底部、最左侧和最右侧的点: 我这里指的点是 (x,y) 坐标。我已经尝试实现 HoughLines(它只检测直线而不
我是一名优秀的程序员,十分优秀!