Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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
Python 在opencv中检测罐头或瓶子_Python_Opencv_Raspberry Pi_Object Detection - Fatal编程技术网

Python 在opencv中检测罐头或瓶子

Python 在opencv中检测罐头或瓶子,python,opencv,raspberry-pi,object-detection,Python,Opencv,Raspberry Pi,Object Detection,我是OpenCV新手,有几个问题。我需要根据瓶子或罐子的形状来检测它们。为此,我使用了覆盆子圆周率板和圆周率相机。背景始终为黑色,不会改变。我曾尝试过许多解决这个问题的可能办法,但都没有得到令人满意的结果。我尝试过的东西包括边缘检测、形态学变换、matchShapes()、matchTemplate()。请让我知道,如果我能做这项任务的效率和最大的准确性 示例图像: 我想出了一个可能有用的方法!如果您了解更多有关can的信息,即宽高比,则可以通过调整矩形大小使其更加坚固 方法 将图像转换为颜色

我是OpenCV新手,有几个问题。我需要根据瓶子或罐子的形状来检测它们。为此,我使用了覆盆子圆周率板和圆周率相机。背景始终为黑色,不会改变。我曾尝试过许多解决这个问题的可能办法,但都没有得到令人满意的结果。我尝试过的东西包括边缘检测、形态学变换、matchShapes()、matchTemplate()。请让我知道,如果我能做这项任务的效率和最大的准确性

示例图像:


我想出了一个可能有用的方法!如果您了解更多有关can的信息,即宽高比,则可以通过调整矩形大小使其更加坚固

方法

  • 将图像转换为颜色空间。将
    V
    增加2倍,以获得更多可见的东西
  • x
    y
    方向查找导数。用两个方向的相等权重计算震级
  • 使用该方法设置图像的阈值
  • 适用于你的形象
  • 应用边缘检测器
  • 找到
  • 查找线条图像的边框
  • 将其叠加到图像上。(最终完成: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()
注意:您可以取消注释显示每个步骤结果的行!我只是为了可读性而评论它们

结果

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


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

这样场景中就不会有瓶子以外的任何物体了?在给定的时间里,除了瓶子或罐子之外,就不会有任何物体了。然后用低值应用,以获得前景。如何确定阈值?如何将其与标准易拉罐尺寸和形状进行比较?您可以设置的阈值非常低,因为您的背景始终为黑色,也可以查看答案以及如何将其与标准易拉罐尺寸和形状进行比较。非常感谢您的评论。我想我可以计算罐头或瓶子的长宽比。我应该将矩形的高度和宽度与标准罐尺寸进行比较。