【记录一个问题】opencv中使用UMat类,在析构的时候出现refcount == 0的断言错误...

本文详细解析了在使用OpenCV进行图像处理时,由于不当使用UMat对象而导致的内存泄漏问题。核心错误在于使用getMat()或getUMat()方法,这将导致引用计数混乱。正确的做法是使用copyTo()方法进行数据拷贝,以避免UMat和Mat之间的关联引发的断言失败。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发生coredump时的错误信息如下:

terminate called after throwing an instance of 'cv::Exception'
what(): OpenCV(4.1.0-dev) /home/admin/opencv/opencv-master/modules/core/src/matrix.cpp:169: error: (-215:Assertion failed) u->refcount == 0 in function 'deallocate'

 

以下写法导致这种断言错误:

cv::resize(u_input_gray, u_input_gray, cv::Size(0, 0), 0.5, 0.5,
      cv::INTER_AREA);
 
 重新编译了debug版本,具体调用堆栈如下:
1 #7  0x00007ffff6f233d7 in _Unwind_Resume (exc=0x128f3e0) at ../../../libgcc/unwind.inc:230
2 #8  0x00000000004589b9 in cv::StdMatAllocator::deallocate (this=0x1209b90, u=0x1269640)
3     at /home/admin/opencv/opencv-master/modules/core/src/matrix.cpp:169
4 #9  0x00000000004fcc17 in cv::UMat::deallocate (this=0x7fffffffd990) at /home/admin/opencv/opencv-master/modules/core/src/umatrix.cpp:490
5 #10 0x0000000000461893 in cv::UMat::release (this=0x7fffffffd990)
6     at /home/admin/opencv/opencv-master/modules/core/include/opencv2/core/mat.inl.hpp:3777
7 #11 0x00000000004fcb9c in cv::UMat::~UMat (this=0x7fffffffd990, __in_chrg=<optimized out>)
8     at /home/admin/opencv/opencv-master/modules/core/src/umatrix.cpp:481

 

p u->refcount
$1 = 6

析构的时候,发现有6个引用,所以崩溃……
===================================
解决办法如下:
不要使用 getMat() 或者 getUMat() 方法
而使用 mat.copyTo(umat) 或者 umat.copyTo(mat)
通过拷贝来避免UMat和mat的关联



转载于:https://www.cnblogs.com/ahfuzhang/p/10978157.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值