在opencv中检测罐头或瓶子

我是OpenCV的新手,并且有几个问题。 我需要根据它们的形状来检测瓶子或罐子。 为此我使用覆盆子pi板和pi相机。 背景总是黑色,不会改变。 我已经尝试了很多可能的解决方案来解决这个问题,但是得不到满意的结果 我尝试过的东西包括边缘检测,形态转换,matchShapes(),matchTemplate()。 请让我知道我是否能够以最高的准确性有效地完成这项任务。

示例图像:

在这里输入图像描述


我想出了一个可能有用的方法! 如果你对罐头有更多的了解,比如宽度与高度的比例,那么可以通过调整矩形的大小来增强它的稳健性!

途径

  • 将图像转换为HSV色彩空间。 将V增加2倍,以获得更多可见的东西。
  • xy方向上查找索贝尔衍生物。 计算两个方向的权重相等。
  • 使用Otsu方法阈值您的图像。
  • 将闭幕应用于你的形象。
  • 应用Canny边缘检测器。
  • 找到霍夫线变换。
  • 查找线条图像的边界矩形。
  • 将它叠加到你的图像上(最后完成:P)
  • image = cv2.imread('image3.jpg', cv2.IMREAD_COLOR)
    original = np.copy(image)
    if image is None:
        print 'Can not read/find the image.'
        exit(-1)
    
    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    H,S,V = hsv_image[:,:,0], hsv_image[:,:,1], hsv_image[:,:,2]
    V = V * 2
    
    hsv_image = cv2.merge([H,S,V])
    image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2RGB)
    image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    # plt.figure(), plt.imshow(image)
    
    Dx = cv2.Sobel(image,cv2.CV_8UC1,1,0)
    Dy = cv2.Sobel(image,cv2.CV_8UC1,0,1)
    M = cv2.addWeighted(Dx, 1, Dy,1,0)
    
    # plt.subplot(1,3,1), plt.imshow(Dx, 'gray'), plt.title('Dx')
    # plt.subplot(1,3,2), plt.imshow(Dy, 'gray'), plt.title('Dy')
    # plt.subplot(1,3,3), plt.imshow(M, 'gray'), plt.title('Magnitude')
    
    ret, binary = cv2.threshold(M,10,255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    # plt.figure(), plt.imshow(binary, 'gray')
    
    binary = binary.astype(np.uint8)
    binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (20, 20)))
    edges = cv2.Canny(binary, 50, 100)
    # plt.figure(), plt.imshow(edges, 'gray')
    
    lines = cv2.HoughLinesP(edges,1,3.14/180,50,20,10)[0]
    output = np.zeros_like(M, dtype=np.uint8)
    for line in lines:
        cv2.line(output,(line[0],line[1]), (line[2], line[3]), (100,200,50), thickness=2)
    # plt.figure(), plt.imshow(output, 'gray')
    
    points = np.array([np.transpose(np.where(output != 0))], dtype=np.float32)
    rect = cv2.boundingRect(points)
    cv2.rectangle(original,(rect[1],rect[0]), (rect[1]+rect[3], rect[0]+rect[2]),(255,255,255),thickness=2)
    original = cv2.cvtColor(original,cv2.COLOR_BGR2RGB)
    plt.figure(), plt.imshow(original,'gray')
    
    
    plt.show()
    

    注意:您可以取消注释显示每个步骤结果的行! 为了可读性,我只是对它们发表评论。

    结果

    结果图像

    注意:如果您知道罐的长宽比,则可以更好地修复它!

    我希望这会有所帮助。 祝你好运 :)

    链接地址: http://www.djcxy.com/p/79581.html

    上一篇: Detecting a can or bottle in opencv

    下一篇: Python, OpenCV: classify gender using ORB features and KNN