应用自定义CenterCrop变换后OpenCV cv.circle报UMat错误问题咨询
问题原因分析
核心诱因:numpy数组内存不连续
你自定义的CenterCrop中使用numpy切片操作裁剪图像:
image = image[top: top + new_h, left: left + new_w]
numpy切片操作默认返回原数组的视图(View),不会触发内存拷贝,生成的数组是内存非连续的。而OpenCV的Python接口要求输入的图像数组必须是C顺序连续的(C-contiguous),非连续数组无法被OpenCV识别,就会抛出Expected Ptr<cv::UMat>的错误。
没有CenterCrop的场景下,图像数组全程都是内存连续的,所以可以正常传入cv.circle使用。
验证方法
你可以在调用cv.circle前打印数组的内存标识验证:
print(img.flags['C_CONTIGUOUS']) # 带CenterCrop时输出False,不带时输出True
修复方案
任选以下任意一种方式即可解决问题:
- 转换numpy数组时强制拷贝生成连续数组:
img = img.permute(1, 2, 0).byte().numpy().copy()
- 在
CenterCrop实现中返回时就做内存拷贝,保证后续流程拿到的都是连续数组:
# 修改CenterCrop的__call__返回逻辑 return {'image': image.copy(), 'landmarks': landmarks}
内容的提问来源于stack exchange,提问作者Kirill Zaitsev
相关产品推荐
相关产品推荐

