OpenCV Mat子矩阵关联机制及运行显示噪点异常问题咨询
问题1:为什么当前程序中pyr_image显示为噪点?
核心原因是pyr_image的创建时机早于copyMakeBorder调用,触发了野内存访问:
- 你预先创建
Mat1b taped_image(rows + 32, cols + 32)时,仅分配了一块未初始化的内存,此时从它截取ROI得到的pyr_image,直接指向这块内存的中心区域。 - 调用
copyMakeBorder时,即使你提前给taped_image预分配了大小匹配的内存,部分OpenCV版本的copyMakeBorder实现仍然会重新分配新的内存空间来存储结果,此时taped_image内部的data指针会更新为新内存的地址,旧内存会被释放。 - 但
pyr_image的data指针仍然指向已经被释放的旧内存,访问野内存就会出现随机噪点;如果用Mat类型时旧内存刚好被系统清零,就会显示全黑。而你显示taped_image正常,是因为它已经指向了被正确填充的新内存。
要修复这个问题,只需要把Mat1b pyr_image = taped_image(Rect{16, 16, cols, rows});这行代码移到copyMakeBorder调用之后即可。
问题2:pyr_image和image是否相互关联,二者的数据是否一致?
二者完全没有内存关联,仅在修复时机问题后数据内容一致:
pyr_image是从taped_image截取的ROI,仅和taped_image共享内存,和原始的image没有任何绑定关系。copyMakeBorder是深拷贝操作,会把image的像素值完整复制到taped_image的对应区域,不会共享内存。哪怕你调整了创建时机让pyr_image显示正常,修改pyr_image的像素只会改动taped_image的内容,不会影响原始的image。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

