使用切片翻转图像后调用cv2.rectangle报错的原因与解决方法
问题原因与解决办法
原因解释
NumPy切片[::-1]垂直翻转图像时,生成的是原数组的非连续内存视图——它只是改变了数组的访问步长,并没有重新排列内存中的数据顺序。而OpenCV的cv2.rectangle等底层函数依赖cv::Mat结构,该结构默认要求输入数组是连续内存布局的,非连续的数组视图无法匹配cv::Mat的内存布局要求,因此触发参数不兼容的报错。
而cv2.flip函数在执行翻转时,会重新分配内存并复制数据,生成的是连续内存的数组,完全符合OpenCV函数的输入要求,所以能正常运行。虽然两种方式得到的图像数值一致,但内存布局的差异导致了兼容性问题。
解决办法
有三种简单可行的方案:
方案1:转换为连续数组
使用NumPy的np.ascontiguousarray()将切片后的非连续视图转换为连续数组:import numpy as np import cv2 # 读取二值图像 img = cv2.imread("binary_img.png", cv2.IMREAD_GRAYSCALE) # 切片翻转后转成连续数组 flipped_img = np.ascontiguousarray(img[::-1]) # 正常绘制矩形 cv2.rectangle(flipped_img, (10,10), (100,100), 255, 2)方案2:直接使用cv2.flip
既然cv2.flip本身就能生成兼容的连续数组,直接用它完成垂直翻转即可(参数0代表垂直翻转):flipped_img = cv2.flip(img, 0) cv2.rectangle(flipped_img, (10,10), (100,100), 255, 2)方案3:生成切片的副本
调用数组的copy()方法,生成切片视图的连续内存副本:flipped_img = img[::-1].copy() cv2.rectangle(flipped_img, (10,10), (100,100), 255, 2)
内容的提问来源于stack exchange,提问作者meysam
相关产品推荐
相关产品推荐

