Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV:检测覆盖标签的边界框_Opencv_Image Processing_Pattern Matching_Vision - Fatal编程技术网

OpenCV:检测覆盖标签的边界框

OpenCV:检测覆盖标签的边界框,opencv,image-processing,pattern-matching,vision,Opencv,Image Processing,Pattern Matching,Vision,我有类似的图像和类似的背景噪音。 使用OpenCV,是否有方法检测标签覆盖区域的区域(检测轮廓)。 或者至少,是否可以检测覆盖标签区域的“粗糙”边界框 我试图完成这项任务,主要的问题是如何选择合适的轮廓,这可能不允许推广该算法。我有两个值(轮廓长度)3108和2855。您可以尝试获取所有照片(如果它们与相机的距离相似),并将所需轮廓的阈值设置在3050和2750之间,但不能保证它会起作用。这就是我如何删除背景(完整代码): 导入cv2 将numpy作为np导入 image=cv2.imread(

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


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

导入cv2
将numpy作为np导入
image=cv2.imread('C:/Users/srlack/Desktop/of8cA.png'))
img=cv2.cvt颜色(图像,cv2.COLOR\u bgr2灰色)
def清除_垂直(img,目标):
对于范围内的i(img.形状[1]):
对于范围内的j(img.形状[0]):
如果img[j][i]:
打破
其他:
目标[j][i]=[0,0,0]
def清除水平(img,目标):
对于范围内的i(img.shape[0]):
对于范围内的j(img.形状[1]):
如果img[i][j]:
打破
其他:
目标[i][j]=[0,0,0]
def关闭(img):
对于范围内的i(img.shape[0]):
对于范围内的j(img.形状[1]):
img[i][j]=0
def开启(img,结果):
就我而言,结果是:
img[i[0][1]][i[0][0]]=255
def f(列表):
最大值=[]
对于列表中的i:
如果len(i)>len(max):
max=i
返回最大值
def rem(负载感应,脱粒):
新的_c=[]
对于ls中的i:
如果len(i)>thresh:
新附录(一)
返回新的\u c
def rn(负载、最小值、最大值):
ret=[]
对于ls中的i:
如果len(i)min:
印刷品(透镜(一))
ret.append(i)
回程网
#ret,tresh=cv2.threshold(img,40255,cv2.THRESH_二进制)
内核=np.ones((2,2),np.uint8)
新=cv2.Canny(img,190,1)
explated=cv2.explate(新的,内核)
tresh,c,hr=cv2.已找到的容器(放大,cv2.翻新树,cv2.链约无)
c=rn(c,2600,4000)
关闭(新)
打开_(新建,c[0])
清除水平(新,图像)
清除垂直(新,图像)
cv2.imwrite('result\u image\u end.png',image)
cv2.imshow('wnd',图像)
cv2.等待键(100)
我尝试过不同的方法,但这似乎比其他方法更有效。我相信opencv exist函数可以在水平和垂直方向上替代这个清晰的函数,但我记不起它的名字了。希望有帮助


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

导入cv2
将numpy作为np导入
image=cv2.imread('C:/Users/srlack/Desktop/of8cA.png'))
img=cv2.cvt颜色(图像,cv2.COLOR\u bgr2灰色)
def清除_垂直(img,目标):
对于范围内的i(img.形状[1]):
对于范围内的j(img.形状[0]):
如果img[j][i]:
打破
其他:
目标[j][i]=[0,0,0]
def清除水平(img,目标):
对于范围内的i(img.shape[0]):
对于范围内的j(img.形状[1]):
如果img[i][j]:
打破
其他:
目标[i][j]=[0,0,0]
def关闭(img):
对于范围内的i(img.shape[0]):
对于范围内的j(img.形状[1]):
img[i][j]=0
def开启(img,结果):
就我而言,结果是:
img[i[0][1]][i[0][0]]=255
def f(列表):
最大值=[]
对于列表中的i:
如果len(i)>len(max):
max=i
返回最大值
def rem(负载感应,脱粒):
新的_c=[]
对于ls中的i:
如果len(i)>thresh:
新附录(一)
返回新的\u c
def rn(负载、最小值、最大值):
ret=[]
对于ls中的i:
如果len(i)min:
印刷品(透镜(一))
ret.append(i)
回程网
#ret,tresh=cv2.threshold(img,40255,cv2.THRESH_二进制)
内核=np.ones((2,2),np.uint8)
新=cv2.Canny(img,190,1)
explated=cv2.explate(新的,内核)
tresh,c,hr=cv2.已找到的容器(放大,cv2.翻新树,cv2.链约无)
c=rn(c,2600,4000)
关闭(新)
打开_(新建,c[0])
清除水平(新,图像)
清除垂直(新,图像)
cv2.imwrite('result\u image\u end.png',image)
cv2.imshow('wnd',图像)
cv2.等待键(100)
我尝试过不同的方法,但这似乎比其他方法更有效。我相信opencv exist函数可以在水平和垂直方向上替代这个清晰的函数,但我记不起它的名字了。希望有帮助


使用更高的阈值然后查找最大的连接组件如何?请澄清,您想在不同的照片上查找类似的标签吗?或者您只需选择标签并删除背景?我要选择标签并删除背景。一旦我提取出包含标签的区域,我就可以使用SURF/SIFT运行它,以找到类似的图像。我已经介绍了第二部分,只是背景噪音太大了,我的命中率太低了哼哼,你为什么不手工裁剪图像呢?对于这张图像,二值化是无缝的。使用更高的阈值,然后找到最大的连接组件怎么样?请你澄清一下,你想在不同的照片上找到类似的标签吗?或者您只需选择标签并删除背景?我要选择标签并删除背景。一旦我提取出包含标签的区域,我就可以使用SURF/SIFT运行它,以找到类似的图像。我已经介绍了第二部分,只是背景噪音太大了,我的命中率太低了,你为什么不手工裁剪图像呢?对于这幅图像,二值化是无缝的。
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)