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

cv2.drawContours报Ptr<cv::UMat>参数错误的原因及解决方法

问题解答

1. Remove的正确定义方式

有两种可靠的正确写法:

  • 方式一:显式指定类型并确保数组连续
    Remove = np.zeros_like(cmask, dtype=np.uint8).copy()
    
    若能确认cmask本身是内存连续的,也可简化为:
    Remove = np.zeros_like(cmask, dtype=np.uint8)
    
  • 方式二:直接通过形状和类型创建
    Remove = np.zeros(cmask.shape, dtype=np.uint8)
    

另外注意:你原代码里的return cmask写在了for循环内部,会导致只处理第一个轮廓就直接返回,这是逻辑错误,需要把return cmask移到循环结束之后。

2. 替代代码可行的原因

OpenCV的drawContours函数要求输入的图像数组必须是内存连续的(C-contiguous),这样才能正确转换为OpenCV内部的cv::UMat格式。

  • 当使用np.zeros_like(cmask)时,生成的数组会继承cmask的内存布局。如果cmask之前经历过切片、转置等操作,它本身会变成非连续数组,那么np.zeros_like生成的Remove也会是非连续的,OpenCV无法识别这种数组,就会抛出TypeError: Expected Ptr<cv::UMat> for argument 'image'错误。
  • 而cmask.copy()会强制生成一个新的、内存连续的数组,np.zeros_like基于这个连续数组创建的Remove自然也是内存连续的,符合OpenCV的要求,所以程序能正常运行。

内容的提问来源于stack exchange,提问作者ck24501

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:24:46