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
相关产品推荐
相关产品推荐

