办理Opencv:TypeError: points is not a numerical tuple

[复制链接]
发表于 2025-9-29 22:59:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
        近来刚开始学习Opencv,跟着b站阿婆主敲代码的时间,又又又又,又出现了bug,下面听我娓娓道来~~
--------------------------------------------------------------------------(手动分边界)
        起首形貌一下其时的环境,要做的使命是辨认卡片上的数字,起首要使用cv2.findContours()方法检测模板图片上数字的外貌,然后对外貌举行排序,盘算外接矩形并resize成符合巨细,然后放到一个数组里,代码如下:
  1. # 计算轮廓
  2. # cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),cv2.RETR_EXTERNAL只检测外轮廓, cv2.CHAIN_APPROX_SIMPLE只保留终点坐标
  3. # 返回的list中每个元素都是图像中的一个轮廓
  4. ref_, refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  5. cv2.drawContours(img, refCnts, -1, (0, 0, 255), 3)
  6. cv_show('img', img)
  7. print(np.array(refCnts, dtype=object).shape)
  8. refCnts = imutils.contours.sort_contours(refCnts, method="left-to-right")
  9. digits = {}
  10. # 遍历每一个轮廓
  11. for (i, c) in enumerate(refCnts):
  12.     # print(type(c))
  13.     # 计算外接矩形并resize成合适大小
  14.     (x, y, w, h) = cv2.boundingRect(c)
  15.     roi = ref[y:y+h, x:x+w]
  16.     roi = cv2.resize(roi, (57, 88))
  17.     # 每一个数字对应每一个模板
  18.     digits[i] = roi
复制代码
        然后运行时就出现了
Traceback (most recent call last):
 File "D:/ocr_template_matching.py", line 51, in <module>
    (x, y, w, h) = cv2.boundingRect(c)
TypeError: points is not a numerical tuple
----------------------------------------------------------------------------------------
        然后根据我的搜索就发现了存在的两个题目:
        第一个题目是,在Opencv3版本和Opencv4版本中,cv2.findContours()方法,返回值的数目是差别的,在Opencv3版本中有三个返回值(本帖版本为Opencv3),在Opencv4版本中有两个返回值(refCnts, hierarchy),如果吸取的位置不对大概数目不对,大概会造成不须要的bug。
        第二个题目是,imutils的外貌排序方法,在当前使用版本的返回值是由两个的(refCnts, bounding_boxes),以是我们应该用两个变量来继承返回值。
        修改代码后,题目顺遂办理。
        下面附上修改子女码:
  1. # 计算轮廓
  2. # cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),cv2.RETR_EXTERNAL只检测外轮廓, cv2.CHAIN_APPROX_SIMPLE只保留终点坐标
  3. # 返回的list中每个元素都是图像中的一个轮廓
  4. ref_, refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  5. cv2.drawContours(img, refCnts, -1, (0, 0, 255), 3)
  6. cv_show('img', img)
  7. print(np.array(refCnts, dtype=object).shape)
  8. (refCnts, bounding_boxes) = imutils.contours.sort_contours(refCnts, method="left-to-right")
  9. digits = {}
  10. # 遍历每一个轮廓
  11. for (i, c) in enumerate(refCnts):
  12.     # print(type(c))
  13.     # 计算外接矩形并resize成合适大小
  14.     (x, y, w, h) = cv2.boundingRect(c)
  15.     roi = ref[y:y+h, x:x+w]
  16.     roi = cv2.resize(roi, (57, 88))
  17.     # 每一个数字对应每一个模板
  18.     digits[i] = roi
复制代码
(本人萌新,如果有错误接待指正!!)
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表