【问题标题】:EXCEPTION_ACCESS_VIOLATION Error for find contours function查找轮廓函数的 EXCEPTION_ACCESS_VIOLATION 错误
【发布时间】:2013-05-09 17:56:13
【问题描述】:

我正在使用 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 运行时环境检测到致命错误:

PC=0x0000000062e3c320, pid=9184, tid=6236 处的 EXCEPTION_ACCESS_VIOLATION (0xc0000005)

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,所以我不确定我哪里出错了。任何有关这方面的建议都会有所帮助。谢谢。

【问题讨论】:

    标签: java video-processing javacv


    【解决方案1】:

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

    尝试添加:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 2012-12-08
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多