python - 在 OpenCV 中使用图像矩进行字体匹配
问题描述
我正在创建一个代码,它将告诉我两个字母彼此之间的相似程度。为此,我决定使用HuMoments
OpenCV 中的概念。
给出的是我拥有的图像
公司.jpg C0.jpg
一个.jpg 一个 .jpg
科罗拉多 州.jpg 科罗拉多州.jpg
我正在使用以下方法阅读图像:
im5 = cv2.imread("images/C0.jpg",cv2.IMREAD_GRAYSCALE)
im7 = cv2.imread("images/Colorado.jpg",cv2.IMREAD_GRAYSCALE)
im9 = cv2.imread("images/A.jpg",cv2.IMREAD_GRAYSCALE)
我正在使用cv2.matchShapes
属性来匹配:
m6 = cv2.matchShapes(im5, im7, cv2.CONTOURS_MATCH_I2,0)
m8 = cv2.matchShapes(im5, im9, cv2.CONTOURS_MATCH_I2,0)
最后我打印输出:
print("C0.png and Colorado.png : {}".format(m6))
print("C0.png and A.jpg : {}".format(m8))
这里最接近零 (0) 的值表示完美匹配
我的输出:
$ python3 shapeMatcher.py
Shape Distances Between
-------------------------
C0.png and Colorado.png : 0.10518804385516889
C0.png and A.jpg : 0.0034705987357361856
C0 和 Colorado 是正确显示的不匹配项。令我困惑的一件事是 C0.jpg 和 A.jpg 是如何紧密匹配的?我是否遗漏了什么,使 C0 和 A 不匹配的另一种方法是什么?请注意,接近零的值意味着最接近的匹配。
解决方案
根据文档,cv2.matchShapes
需要轮廓作为输入,而不是图像。
本教程有一个示例用法:
import cv2
import numpy as np
img1 = cv2.imread('star.jpg',0)
img2 = cv2.imread('star2.jpg',0)
ret, thresh = cv2.threshold(img1, 127, 255,0)
ret, thresh2 = cv2.threshold(img2, 127, 255,0)
contours,hierarchy = cv2.findContours(thresh,2,1)
cnt1 = contours[0]
contours,hierarchy = cv2.findContours(thresh2,2,1)
cnt2 = contours[0]
ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print ret
(请注意,findContours
语法从 OpenCV 2 更改为 OpenCV 3。)
推荐阅读
- docker - 健康状况为黄色的 Elasticsearch 索引
- javascript - 同步功能没有相应地工作
- vue.js - 如何使用 vue js 在 tinymce 编辑器中插入内容?
- ios - 动画第一次工作,但后来
- javascript - 根据选项菜单 1 或 2 中的选择隐藏或显示选项菜单
- powerbi - 在 Power BI 中在线发布的权限
- python - 多处理未运行
- javascript - 在 JavaScript 中根据我的生日获取 REAL_AGE
- apache - ASP.NET Core - Kestrel 在特定设备上的 Apache 反向代理后面找不到静态文件
- python - 创建一个列,其值取决于其他列和创建的列以前的值