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
Opencv 对货架上的产品进行细分_Opencv_Image Processing - Fatal编程技术网

Opencv 对货架上的产品进行细分

Opencv 对货架上的产品进行细分,opencv,image-processing,Opencv,Image Processing,我尝试使用直方图投影检测货架上产品的边缘。但我被困在两个层次 我面临的挑战是: 如何从图像中获取最长的非货架段,即从可用产品中检测货架上最宽产品的宽度 如何使用自定义标记实现形态重建 所有小的水平段,我正在生成2个标记,可以在“markers.png”(附件)中看到。使用它们,我计算两个标记的最小重建输出 Need assistance on this. Thanks a lot Below is my python code for the same. Below is my python c

我尝试使用直方图投影检测货架上产品的边缘。但我被困在两个层次

我面临的挑战是:

  • 如何从图像中获取最长的非货架段,即从可用产品中检测货架上最宽产品的宽度
  • 如何使用自定义标记实现形态重建
  • 所有小的水平段,我正在生成2个标记,可以在“markers.png”(附件)中看到。使用它们,我计算两个标记的最小重建输出

    Need assistance on this.
    Thanks a lot
    Below is my python code for the same.
    Below is my python code
    
    ********************************************************************************
    
    import numpy as np
    import cv2 as cv
    from matplotlib import pyplot as plt
    import math
    
    # Read the input image
    img = cv.imread('C:\\Users\\672059\\Desktop\\p2.png')
    # Converting from BGR to RGB. Default is BGR.
    # img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)
    # Resize the image to 150,150
    img_resize = cv.resize(img, (150, 150))
    # Get the dimensions of the image
    img_h, img_w, img_c = img_resize.shape
    # Split the image on channels
    red = img[:, :, 0]
    green = img[:, :, 1]
    blue = img[:, :, 2]
    
    # Defining a vse for erosion
    vse = np.ones((img_h, img_w), dtype=np.uint8)
    
    # Morphological Erosion for red channel
    red_erode = cv.erode(red, vse, iterations=1)
    grad_red = cv.subtract(red, red_erode)
    # Morphological Erosion for green channel
    green_erode = cv.erode(green, vse, iterations=1)
    grad_green = cv.subtract(green, green_erode)
    # Morphological Erosion for blue channel
    blue_erode = cv.erode(blue, vse, iterations=1)
    grad_blue = cv.subtract(blue, blue_erode)
    
    # Stacking the individual channels into one processed image
    grad = [grad_red, grad_green, grad_blue]
    retrieved_img = np.stack(grad, axis=-1)
    retrieved_img = retrieved_img.astype(np.uint8)
    retrieved_img_gray = cv.cvtColor(retrieved_img, cv.COLOR_RGB2GRAY)
    plt.title('Figure 1')
    plt.imshow(cv.bitwise_not(retrieved_img_gray), cmap=plt.get_cmap('gray'))
    plt.show()
    
    # Hough Transform of the image to get the longest non shelf boundary from the image!
    edges = cv.Canny(retrieved_img_gray, 127, 255)
    minLineLength = img_w
    maxLineGap = 10
    lines = cv.HoughLinesP(edges, 1, np.pi/180, 127, minLineLength=1, maxLineGap=1)
    temp = img.copy()
    l = []
    for x in range(0, len(lines)):
        for x1, y1, x2, y2 in lines[x]:
            cv.line(temp, (x1, y1), (x2, y2), (0, 255, 0), 2)
            d = math.sqrt((x2-x1)**2 + (y2-y1)**2)
            l.append(d)
    
    # Defining a hse for erosion
    hse = np.ones((1, 7), dtype=np.uint8)
    opening = cv.morphologyEx(retrieved_img_gray, cv.MORPH_OPEN, hse)
    plt.title('Figure 2')
    plt.subplot(1, 2, 1), plt.imshow(img)
    plt.subplot(1, 2, 2), plt.imshow(cv.bitwise_not(opening), 'gray')
    plt.show()
    
    # Dilation with disk shaped structuring element
    horizontal_size = 7
    horizontalstructure = cv.getStructuringElement(cv.MORPH_ELLIPSE, (horizontal_size, 1))
    dilation = cv.dilate(opening, horizontalstructure)
    plt.title('Figure 3')
    plt.imshow(cv.bitwise_not(dilation), 'gray')
    plt.show()
    # Doing canny edge on dilated image
    edge = cv.Canny(dilation, 127, 255)
    plt.title('Figure 4')
    plt.imshow(edges, cmap='gray')
    plt.show()
    
    h_projection = edge.sum(axis=1)
    print(h_projection)
    plt.title('Projection')
    plt.plot(h_projection)
    plt.show()
    
    
    listing = []
    for i in range(1, len(h_projection)-1):
        if h_projection[i-1] == 0 and h_projection[i] == 0:
            listing.append(dilation[i])
            listing.append(dilation[i-1])
            a = np.array([np.array(b) for b in l])
            h = len(l)
            _, contours, _ = cv.findContours(a, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
            x, y, w, h = cv.boundingRect(contours[0])
            y = y + i - h
            cv.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
            l.clear()
    
    plt.imshow(img)
    plt.show()
    
    # Generating a mask
    black_bg = np.ones([img_h, img_w], dtype=np.uint8)
    # Clone the black bgd image
    left = black_bg.copy()
    right = black_bg.copy()
    # Taking 10% of the image width
    ten = int(0.1 * img_w)
    left[:, 0:ten+1] = 0
    right[:, img_w-ten:img_w+1] = 0
    plt.title('Figure 4')
    plt.subplot(121), plt.imshow(left, 'gray')
    plt.subplot(122), plt.imshow(right, 'gray')
    plt.show()
    # Marker = left and right. Mask = dilation
    mask = dilation
    marker_left = left
    marker_right = right
    

    markers.png链接:


    根据您输入的图像,我会:

    • 拍一张空冰箱的照片
    • 然后将当前图像与空图像进行比较
    • 玩形态运算
    • 获取连接的组件>大小N
    如果您无法拍摄空冰箱图像:

    • 分割搁板(基本白色零件)
    • 使用工具架的图像力矩撤消图像的旋转
    • 对于每个货架:
      • 饱和时的阈值
      • 做一个垂直投影
      • 马克西玛伯爵
    Tresholded:

    侵蚀扩张:

    连接的组件(宽度>10*高度+>最小尺寸):

    你有架子

    现在从每个架子上取平均Y形,并将原始图像切成几块:

    抖动至8种颜色:

    和阈值:

    连接的组件(h>1.5*w,minsize…这里很难,我玩过:)


    请发布示例图片和intermedatie结果。您好,我无法上传图片,因此提供链接。markers.png链接:输入图像链接:Canny边缘输出:水平投影输出链接:检测到的边缘链接:Hi RobAu,图像的水平分割是我的第一个目标。我无法实现这一目标。你能帮助我吗。我知道这对一些人来说可能是非常重要的,但我已经被绊倒了。感谢您的帮助我不理解这里连接组件的概念:(另外,我不会随身携带任何空冰箱图像。非常感谢RobAu,解决方案是否足够通用?如何在形态学操作中选择内核大小?我需要尽可能独立于图像的配置。非常感谢:)你用了什么样的阈值?我没有得到与你相似的结果
    ********************************************************************************
    
    ********************************************************************************