有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传
下篇内容:
openCV实战-系列教程13:文档扫描OCR识别下(图像轮廓/模版匹配)项目实战、源码解读
如果还没有安装openCV,请看这篇安装教程
在运行参数配置界面输入以下指令即可运行
--image ./images/receipt.jpg
2023版pycharm配置运行参数教程
新版本openCV中的cv2.findContours返回值从3个变成了两个
通过修改参数receipt.jpg,可以处理其他的图像数据。
运行打印结果:
C:\Users\Alex\anaconda3\envs\CV\python.exe A:\2_gupao\ocr\scan.py --image ./images/receipt.jpg
STEP 1: 边缘检测
STEP 2: 获取轮廓
STEP 3: 变换
进程已结束,退出代码为 0
原始图像是一张购物小票,是从任意角度拍摄的,需要把这个小票调整到一个正确的角度,然后才能进行文字识别。第一步需要进行边缘检测,得到这个小票。
第二步框出这个小票,这个框起来的过程就是一个轮廓检测。
第三张就需要把这个小票放正了,整齐的排列出来,才能识别出里面的文字,做字符识别的操作。
第四步将这个小票的内容的文字识别出来,即OCR文字识别。
image = cv2.imread(args["image"])
ratio = image.shape[0] / 500.0
orig = image.copy()
image = resize(orig, height=500)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(gray, 75, 200)
print("STEP 1: 边缘检测")
cv2.imshow("Image", image)
cv2.imshow("Edged", edged)
cv2.waitKey(0)
cv2.destroyAllWindows()
打印结果:
STEP 1: 边缘检测
cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:5]
for c in cnts:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
if len(approx) == 4:
screenCnt = approx
break
print("STEP 2: 获取轮廓")
cv2.drawContours(image, [screenCnt], -1, (0, 255, 0), 2)
cv2.imshow("Outline", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
打印结果:
STEP 2: 获取轮廓
我们有A、B、C、D四个点,组成一个不规整的四边形,现在通过下面这个函数,将这四个点的顺序调整到合适的顺序,调整后的结果方便我们把四个点映射成规整的矩形的四个点
def order_points(pts):
rect = np.zeros((4, 2), dtype="float32")
s = pts.sum(axis=1)
rect[0] = pts[np.argmin(s)]
rect[2] = pts[np.argmax(s)]
diff = np.diff(pts, axis=1)
rect[1] = pts[np.argmin(diff)]
rect[3] = pts[np.argmax(diff)]
return rect
下篇内容:
openCV实战-系列教程13:文档扫描OCR识别下(图像轮廓/模版匹配)项目实战、源码解读