马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
近来刚开始学习Opencv,跟着b站阿婆主敲代码的时间,又又又又,又出现了bug,下面听我娓娓道来~~
--------------------------------------------------------------------------(手动分边界)
起首形貌一下其时的环境,要做的使命是辨认卡片上的数字,起首要使用cv2.findContours()方法检测模板图片上数字的外貌,然后对外貌举行排序,盘算外接矩形并resize成符合巨细,然后放到一个数组里,代码如下:- # 计算轮廓
- # cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),cv2.RETR_EXTERNAL只检测外轮廓, cv2.CHAIN_APPROX_SIMPLE只保留终点坐标
- # 返回的list中每个元素都是图像中的一个轮廓
- ref_, refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- cv2.drawContours(img, refCnts, -1, (0, 0, 255), 3)
- cv_show('img', img)
- print(np.array(refCnts, dtype=object).shape)
- refCnts = imutils.contours.sort_contours(refCnts, method="left-to-right")
- digits = {}
- # 遍历每一个轮廓
- for (i, c) in enumerate(refCnts):
- # print(type(c))
- # 计算外接矩形并resize成合适大小
- (x, y, w, h) = cv2.boundingRect(c)
- roi = ref[y:y+h, x:x+w]
- roi = cv2.resize(roi, (57, 88))
- # 每一个数字对应每一个模板
- 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),以是我们应该用两个变量来继承返回值。
修改代码后,题目顺遂办理。
下面附上修改子女码:- # 计算轮廓
- # cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),cv2.RETR_EXTERNAL只检测外轮廓, cv2.CHAIN_APPROX_SIMPLE只保留终点坐标
- # 返回的list中每个元素都是图像中的一个轮廓
- ref_, refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- cv2.drawContours(img, refCnts, -1, (0, 0, 255), 3)
- cv_show('img', img)
- print(np.array(refCnts, dtype=object).shape)
- (refCnts, bounding_boxes) = imutils.contours.sort_contours(refCnts, method="left-to-right")
- digits = {}
- # 遍历每一个轮廓
- for (i, c) in enumerate(refCnts):
- # print(type(c))
- # 计算外接矩形并resize成合适大小
- (x, y, w, h) = cv2.boundingRect(c)
- roi = ref[y:y+h, x:x+w]
- roi = cv2.resize(roi, (57, 88))
- # 每一个数字对应每一个模板
- digits[i] = roi
复制代码 (本人萌新,如果有错误接待指正!!)
|