问题描述
我正在尝试为自定义对象(此面板)创建路标检测器:
我正在经历多种方法:使用热图和基于回归的热图。
我尝试使用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([])
这是输出:
关于将图像转换为灰度图像,由于图像是在户外拍摄的,因此您需要对其进行归一化处理以消除日光等的影响,因此将图像转换为灰度图像可以用作归一化处理。因此,它弊大于利。