0

我正在使用 cvFindContours 来查找边缘检测帧的轮廓。首先,我使用 cvCanny 从实际帧中获取边缘帧。然后我试图找到轮廓。这是我的代码结构

//使用 cvcanny 获取当前帧和下一帧

CvMemStorage curstorage=CvMemStorage.create();
CvMemStorage nextstorage=CvMemStorage.create();

CvSeq cursquares = new CvContour();
CvSeq nextsquares = new CvContour();

cvFindContours(cur, curstorage, cursquares, Loader.sizeof(CvContour.class),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

cvFindContours(next, nextstorage, nextsquares, Loader.sizeof(CvContour.class),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

当我运行代码时,我得到访问冲突异常。这是异常详细信息。

Java 运行时环境检测到一个致命错误:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000062e3c320, pid=9184, tid=6236

JRE 版本:7.0_17-b02 Java VM:Java HotSpot(TM) 64 位服务器 VM(23.7-b01 混合模式 windows-amd64 压缩 oops)有问题的框架:C [msvcr100.dll+0x3c320] memset+0x80

无法写入核心转储。默认情况下,在 Windows 的客户端版本上不启用小型转储

我不确定我哪里出错了,因为我刚刚开始使用 javacv。任何关于此的建议都会有所帮助。谢谢。

4

1 回答 1

0

您可能不会在调用CvMemStorage后引用您的实例,只有's. 存储可能被评估为未引用并因此被 GC,而您仍需要使用 CvSeq,这取决于存储。这将在 GC 发生后第一次使用 CvSeq 时导致 EXCEPTION_ACCESS_VIOLATION。cvFindContoursCvSeq

尝试添加:

curstorage.release();
nextstorage.release();

在您退出使用 CvSeq 之后。它有两个优点:主动释放本机内存而不等待 GC,并防止 GC 过早释放存储。在这里查看我的问题:JavaCV 本机对象释放

于 2013-05-09T09:56:13.690 回答