在CV2中以不同的方向匹配模板图像

时间:2019-07-12 18:01:19

标签: opencv python-3.6

所以我是一个非常有经验的开发人员,试图研究一些机器学习/神经网络代码。

基本上,我需要一个巨大的数据集,所以我的第一个问题是我需要找到一种快速标记大量图像的方法。因此,以this为例。

我当时想我可以在主图像及其下面的图像上使用模板匹配吗?这样一来,我只需要获得使用这些数据的权限,就可以非常快速地对其进行标记。

使用openCV时(从示例中),我得到一些非常时髦的结果,它们在图像中找不到板,它确实绘制了框,但没有在板周围,经过测试,它非常非常接近几次,但代码并不多...

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imread('./image2.jpg',0)
img2 = img.copy()
template = cv.imread('./Plate2.test.png',0)
w, h = template.shape[::-1]
# All the 6 methods for comparison in a list
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR',
            'cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED']
for meth in methods:
    img = img2.copy()
    method = eval(meth)
    # Apply template Matching
    res = cv.matchTemplate(img,template,method)
    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
    # If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
    if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)
    cv.rectangle(img,top_left, bottom_right, 255, 2)
    plt.subplot(121),plt.imshow(res,cmap = 'gray')
    plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
    plt.subplot(122),plt.imshow(img,cmap = 'gray')
    plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)
    plt.show()

第一件事是我猜这是行不通的,因为我们要在其上寻找模板的主图像的方向不同。

我要指出的第二件事是我不是Python程序员,所以我也在学习,这是我第一次接触OpenCV,因此我试图将我对对象检测的理解应用于我的东西。不能正确理解。

我想做的是从较小的板中获得MAIN图像中边界框的坐标,这样我可以(获得许可)创建一个像样的数据集来真正快速地进行训练-否则,我必须手动进行操作: -(

任何帮助将不胜感激,我有很多示例在工作,但这是一个有趣的问题,我没有发现任何参考。

在我看来,步骤是:

1)找到板并创建边界框

2)在尽可能多的图像上训练数据集,以便在所述板上检测物体

3)测试板时需要从主图像中提取图像,然后应用透视变换。

4)如果愿意,可以将平板放平后进行文本提取。

更新:

所以我尝试了here中的SIFT,结果如下(请注意,该图片已经在上述网站的公共领域中。)-不太符合目标!

更新2

我已经设法按照评论中建议的JD整理了一篇文章中的解决方案,从本质上讲,它使我可以标记足够的图像来创建神经网络,从而更好地检测它们-我将发布更新很快就会得到答案。

enter image description here

0 个答案:

没有答案