【问题标题】:Comparing signatures using Opencv使用 Opencv 比较签名
【发布时间】:2020-09-12 22:57:55
【问题描述】:

我想比较两个签名之间的相似之处。

Python version : 3.7.7
OpenCv version : 4.2.0

这是我到目前为止所做的:

from cv2 import *
import numpy as np


#uploading images
template = cv2.imread("C://Users//subhr//Ams_1.jpg")
original = cv2.imread("C://Users//subhr//Ams_2.jpg")

#resizing images
template = cv2.resize(template,(528,152))
cv2.imshow("template image", template)
cv2.waitKey(0)
cv2.destroyAllWindows()
template.shape #row.columns
original = cv2.resize(original,(528,152))
cv2.imshow("original image", original)
cv2.waitKey(0)
cv2.destroyAllWindows()

#ORB Detector
orb = cv2.ORB_create()

original = cv2.Canny(original, 50, 200)
template = cv2.Canny(template, 50, 200)

# key points and descriptor calculation
kp1, desc_1 = orb.detectAndCompute(template, None)
kp2, desc_2 = orb.detectAndCompute(original, None)

#creating matches
matcher = cv2.DescriptorMatcher_create(cv2.DescriptorMatcher_BRUTEFORCE_HAMMING)
matches_1 = matcher.knnMatch(desc_1, desc_2, 2)
len(matches_1)

result = cv2.drawMatchesKnn(original, kp1 , template, kp2, matches_1, None)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

#distance similarity
good_points = []
for m,n in matches_1:
    if m.distance < 0.8* n.distance:
        good_points.append(m)
len(good_points)

result = cv2.drawMatches(original, kp1 , template, kp2, good_points, None)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

print(len(kp1))
print(len(kp2))

#calculating ratio
print("How good is the match : ",len(kp1)/len(good_points))

此时,我已经尝试过 orbakaze ,我想使用 SIFT 但它不可用.我尝试过 Opencv 3.4 版,但没有成功。

有没有更好的方法来比较签名的相似性并标准化整个过程?

图片链接:https://ibb.co/yhvTrnghttps://ibb.co/xfBzCgW

谢谢。

【问题讨论】:

    标签: python opencv computer-vision opencv3.0 sift


    【解决方案1】:

    您没有给出任何示例图像,但即便如此,我也不确定使用诸如 orb 或 Kaze/Akaze 之类的特征点是否是个好主意。在以某种程度的准确度比较签名时,那些或多或少仍然检测到类似角点的点似乎需要更多的知识(曲率等)。这看起来像是一个简单的卷积网络擅长的事情。在我的脑海中,我认为您可以使用例如这样的架构:

    signature --> Convnet --> head-1 --> signature embedding  ------>---
                          |                                             |---> (Hinge) loss
                          |                                             |
                           --> head-2 --> signtature embedding ---->----
    

    其中损失迫使相似签名的嵌入更接近,而不同签名的嵌入彼此远离。

    您可以将您的架构基于这个有点旧的paper。关于训练网络的数据,有很多数据集(看看this kaggle link 例如)。

    编辑:既然您在评论中说您更愿意避免基于深度学习的方法,我认为看看您当前的方法在功能方面缺乏什么会很有用。

    您提取的低级特征(尽管不要提取 ORB,它的设计目的是快速、不准确,如果可以的话,请坚持使用 KAZE 或 AKAZE)捕获本地信息,但对于签名识别而言,重要的是它们如何是空间分布的(在相似的签名中分布应该大致相同)。这可以通过以下两种方式之一或两种方式来解决:1)改变评估相似性的方式以结合空间分布,而不是仅仅依赖于共同特征点的数量 2)手动设计一个捕获全局方面的高级互补特征签名(可以像高度/宽度比一样简单,也可以更复杂并考虑曲率等)。

    【讨论】:

    • 感谢您的建议,我的想法是创建一个没有任何深度学习技术的架构,因此我尝试使用 OpenCV,但我不确定这是否是正确的方法。
    • 感谢您的反馈。我编辑了我的答案,以分享一些关于如何做到这一点的想法。我认为,尽管从您正在使用的图片中添加一两张示例图片可能会吸引更多知识渊博的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2018-10-12
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    相关资源
    最近更新 更多