You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 21:24:06