我试图在随机背景下检测广告牌图像。我能够使用SSD定位广告牌,这给了我广告牌周围的大致边界框。现在,我想为我的应用程序找到广告牌的确切角落。我尝试使用遇到的不同策略,例如哈里斯拐角检测(使用Opencv),使用Canny +形态运算+轮廓查找线的交点。输出的详细信息如下。
哈里斯拐角检测哈里斯拐角检测 的伪代码如下:
img_patch_gray = np.float32(img_patch_gray)
harris_point = cv2.cornerHarris(img_patch_gray,2,3,0.04)
img_patch[harris_point>0.01*harris_point.max()]=[255,0,0]
plt.figure(figsize=IMAGE_SIZE)
plt.imshow(img_patch)
Run Code Online (Sandbox Code Playgroud)
这里的红色点是由Harris角点检测算法检测到的角点,感兴趣的点用绿色圈出。
使用霍夫线检测 在这里,我试图找到线的交点,然后选择点。类似于stackoverflow链接,但由于广告牌中包含文本和图形,因此很难获得确切的线条。
基于轮廓的方法 在此方法中,我使用了canny边缘检测器,然后使用了dilation(3 * 3内核),然后使用了轮廓。
bin_img = cv2.Canny(gray_img_patch,100,250)
bin_img = dilate(bin_img, 3)
plt.imshow(bin_img, cmap='gray')
(_,cnts, _) = cv2.findContours(bin_img.copy(),
cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:10]
cv2.drawContours(img_patch, [cnts[0]],0, (0,255,0), 1)
Run Code Online (Sandbox Code Playgroud)
,
。我曾尝试使用来自openCV的roxPolyDp函数,但它没有达到预期的效果,因为它还可以通过四点近似较大或较小的轮廓,并且在某些图像中,它可能不会在广告牌框架周围形成轮廓。
我已将openCV 3.4用于所有图像处理操作。
使用的可以在这里找到。请注意,此处讨论的图像仅用于说明目的,一般而言,该图像可以是任何广告牌。在此先感谢您的帮助。