如何从用于自定义对象的地标检测器开始?

问题描述

我正在尝试为自定义对象(此面板)创建路标检测器:

enter image description here

我正在经历多种方法:使用热图和基于回归的热图。

我尝试使用this Kaggle notebook并发现它很有用,但是它具有灰度数据,并且可能由于面板本身很暗而无法正常工作。

是否有记录良好的方法

解决方法

如果您的目的是检测角的坐标,则您提出的方法是过大的。您可以简单地为每个角落做template matching。请参阅下面的代码以获取大致示例

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#%%
src = cv.imread('airMH.jpg')

gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
blur=cv.GaussianBlur(gray,(3,3),1)
templateRightBot = blur[170:205,110:135];
templateLeftBot = blur[150:185,15:50];
templateRightTop = blur[35:75,135:160];
templateLeftTop = blur[30:50,80:105];

#%%
img=src.copy()
w,h = templateLeftTop .shape[::-1]
res = cv.matchTemplate(gray,templateLeftTop,cv.TM_CCOEFF)
min_val,max_val,min_loc,max_loc = cv.minMaxLoc(res)
top_left = max_loc
templateLeftTop = (top_left[0] + w,top_left[1] + h)
cv.rectangle(img,top_left,255,2)
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('LeftTop'),plt.xticks([]),plt.yticks([])

img=src.copy()
w,h = templateRightTop .shape[::-1]
res = cv.matchTemplate(gray,templateRightTop,max_loc = cv.minMaxLoc(res)
top_left = max_loc
templateRightTop = (top_left[0] + w,2),cmap = 'gray')
plt.title('RightTop'),h = templateLeftBot .shape[::-1]
res = cv.matchTemplate(gray,templateLeftBot,max_loc = cv.minMaxLoc(res)
top_left = max_loc
templateLeftBot = (top_left[0] + w,cmap = 'gray')
plt.title('LeftBot'),h = templateRightBot .shape[::-1]
res = cv.matchTemplate(gray,templateRightBot,max_loc = cv.minMaxLoc(res)
top_left = max_loc
templateRightBot = (top_left[0] + w,4),cmap = 'gray')
plt.title('RightBot'),plt.yticks([])

这是输出:

output of template matching

关于将图像转换为灰度图像,由于图像是在户外拍摄的,因此您需要对其进行归一化处理以消除日光等的影响,因此将图像转换为灰度图像可以用作归一化处理。因此,它弊大于利。