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

OpenCV运行手写识别代码报Expected Ptr<cv::UMat>错误求助

问题说明

基于OpenCV与Keras开发天城文手写识别程序时,更换多个OpenCV版本仍存在运行异常:程序调用摄像头完成颜色掩膜处理、提取轮廓后,执行选取面积最大轮廓的代码行时触发类型错误,直接终止运行。
完整报错信息如下:

line 95, in <module>
    main()
File "c:\HindiHandWritingRecognizer\application.py", line 37, in main
    contou = max(cnts, key=cv2.contourArea(cnts))
TypeError: Expected Ptr<cv::UMat> for argument 'contour'
[ WARN:0] terminating async callback
错误原因
  • max()函数的key参数写法错误:key参数需要传入可调用对象,原代码写为cv2.contourArea(cnts)是直接传入整个轮廓列表执行函数,而非对列表中单个轮廓元素计算面积,因此触发参数类型错误。
  • cv2.findContours()返回值存在跨版本兼容问题:OpenCV 3.x版本该函数返回3个值(处理后图像, 轮廓列表, 层级表),OpenCV 4.x版本返回2个值(轮廓列表, 层级表),原代码固定取返回值索引[1]的写法,在不同版本下会拿到错误的对象(比如4.x版本下拿到的是层级表而非轮廓列表)。
  • 逻辑判断写法无效:原代码if len(pts) != []中,len()返回值为整数,和空列表做比较永远返回True,会导致无手写轨迹时也触发识别逻辑,增加不必要的报错风险。
  • 绘制逻辑顺序错误:原代码在center变量初始化为None时就调用cv2.circle(img, center, ...),会触发空参数错误。
修复方法
  1. 修正max()取最大轮廓的写法,将key参数改为传入函数对象本身:
    把原代码第37行
    contou = max(cnts, key=cv2.contourArea(cnts))
    
    修改为
    contou = max(cnts, key=cv2.contourArea)
    
  2. 增加findContours跨版本兼容逻辑,替换两处轮廓提取的固定索引取值:
    原代码中
    cnts = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[1]
    
    和
    blackboard_cnts = cv2.findContours(thresh1.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[1]
    
    分别修改为
    cnts = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    
    blackboard_cnts = cv2.findContours(thresh1.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    blackboard_cnts = blackboard_cnts[0] if len(blackboard_cnts) == 2 else blackboard_cnts[1]
    
  3. 修正无效的长度判断,把原代码
    if len(pts) != []:
    
    修改为
    if len(pts) > 0:
    
  4. 调整中心点绘制的代码顺序,将cv2.circle(img, center, 5, (0, 0, 255), -1)移动到center变量赋值完成之后,也就是以下两行代码的后面:
    M = cv2.moments(contou)
    center = (int(M['m10'] / M['m00']), int(M['m01'] / M['m00']))
    

完成以上修改后程序即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:48:58