【问题标题】:OpenCV : Detecting bounding-box covering the labelOpenCV:检测覆盖标签的边界框
【发布时间】:2017-02-28 19:22:57
【问题描述】:

我有类似的图像,具有类似的背景噪音。 使用 OpenCV,有没有办法检测覆盖标签的区域(检测轮廓)。 或者至少,是否可以检测到覆盖标签区域的“粗糙”边界框?

【问题讨论】:

  • 如何使用更高的阈值然后找到最大的连接组件?。
  • 您能否澄清一下,您想在不同的照片上找到相似的标签吗?或者你只想自己选择标签并删除背景?
  • 我想选择标签并移除背景。提取包含标签的区域后,我可以使用 SURF/SIFT 运行它以查找相似图像。第二部分我已经讲完了,只是背景噪音我的命中率太低了
  • 咳咳,你为什么不手动裁剪图像?
  • 对于这张图片,二值化是无缝的。

标签: opencv image-processing pattern-matching vision


【解决方案1】:

我已经尝试完成这项任务,可能无法概括该算法的主要问题是如何选择合适的轮廓。我有两个值(轮廓长度)3108 和 2855。您可以尝试获取所有照片(如果它们与相机的距离相似)并在 3050 和 2750 之间设置所需轮廓的阈值,但不能保证它会起作用。所以这就是我删除背景的方式(完整代码):

import cv2 
import numpy as np


image=cv2.imread('C:/Users/srlatch/Desktop/of8cA.png')
img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

def clear_vertical(img, target):
    for i in range(img.shape[1]):
        for j in range(img.shape[0]):
            if img[j][i]:
                break
            else:
                target[j][i]=[0,0,0]

def clear_horizontal(img, target):
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            if img[i][j]:
                break
            else:
                target[i][j]=[0,0,0]



def turn_off(img):
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            img[i][j]=0

def turn_on(img,result):
    for i in result:
       img[i[0][1]][i[0][0]]=255


def f(list):
    max=[]
    for i in list:
        if len(i)>len(max):
            max=i
    return max 

def rem(ls, thresh):
    new_c=[]
    for i in ls:
        if len(i)>thresh:
            new_c.append(i)
    return new_c 

def rn(ls,min,max):
    ret=[]
    for i in ls:
         if len(i)<max and len(i)>min:
             print(len(i))
             ret.append(i)
    return ret

#ret,tresh = cv2.threshold(img,40,255,cv2.THRESH_BINARY)
kernel = np.ones((2,2),np.uint8)
new=cv2.Canny(img,190,1)
dilated=cv2.dilate(new, kernel)
tresh,c,hr=cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
c=rn(c, 2600, 4000)
turn_off(new)
turn_on(new,c[0])

clear_horizontal(new,image)
clear_vertical(new,image)

cv2.imwrite('result_image_end.png',image)

cv2.imshow('wnd',image)
cv2.waitKey(100)

我尝试了不同的方法,但这似乎比其他方法效果更好。我相信 opencv 存在的函数可以替代这个 clear_horizo​​ntally 和垂直,但我不记得它的名字了。希望能帮助到你!

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 2019-06-18
    • 1970-01-01
    • 2014-04-23
    • 2018-04-27
    • 2020-07-22
    • 1970-01-01
    • 2022-01-07
    • 2018-08-23
    相关资源
    最近更新 更多