使用OpenCV circle函数时numpy数组切片报错原因咨询
问题原因与解决方案
确实和numpy的数组处理机制有关,核心差异在于内存连续性:
b是直接创建的二维numpy数组,内存是连续存储的,完全符合OpenCV对cv::Mat的内存格式要求,所以cv2.circle能正常运行。a[..., 0]是对三维数组的切片操作,numpy返回的是原数组的视图而非独立新数组。这个视图的内存并非连续块(原数组是(高度,宽度,通道数)的HWC格式,每个通道的元素是间隔排布的),而OpenCV绝大多数函数要求输入图像必须是连续内存块,因此会抛出img is incompatible with cv::Mat错误。
修复方法
通过以下方式可让切片后的数组满足内存连续要求:
- 用
np.ascontiguousarray()转换为连续数组:
cv2.circle(np.ascontiguousarray(a[..., 0]), (100,100),3,1,-1)
- 直接复制切片结果(生成新的连续内存数组):
cv2.circle(a[..., 0].copy(), (100,100),3,1,-1)
- 先将切片结果转为连续变量再处理(如需写回原数组可后续赋值):
channel = np.ascontiguousarray(a[..., 0]) cv2.circle(channel, (100,100),3,1,-1) a[..., 0] = channel
内容的提问来源于stack exchange,提问作者m33n
相关产品推荐
相关产品推荐

