加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在opencv中检测罐子或瓶子

发布时间:2020-12-16 21:30:33 所属栏目:Python 来源:网络整理
导读:我是OpenCV的新手并且有一些问题.我需要根据它们的形状检测瓶子或罐子.为此我使用了覆盆子pi板和pi相机.背景总是黑色,不会改变.我已经尝试了很多可能的解决方案来解决这个问题但是无法获得满意的结我尝试过的东西包括边缘检测,形态转换,matchShapes(),matchT
我是OpenCV的新手并且有一些问题.我需要根据它们的形状检测瓶子或罐子.为此我使用了覆盆子pi板和pi相机.背景总是黑色,不会改变.我已经尝试了很多可能的解决方案来解决这个问题但是无法获得满意的结我尝试过的东西包括边缘检测,形态转换,matchShapes(),matchTemplate().如果我能够有效且最准确地完成这项任务,请告诉我.

示例图片:

解决方法

我想出了一个可能有帮助的方法!如果您了解罐头的更多信息,即宽高比,通过调整矩形尺寸可以更加稳固!

途径

>将图像转换为HSV色彩空间.将V增加2倍,以获得更多可见的东西.
>在x和y方向找到Sobel衍生物.计算两个方向的重量相等的量值.
>使用Otsu方法阈值图像.
>将Closing应用于您的图像.
>应用Canny边缘检测器.
>找到Hough Line Transform.
>查找线图像的边界矩形.
>将其叠加到您的图像上.(最后完成: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],2]
V = V * 2

hsv_image = cv2.merge([H,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,1)
M = cv2.addWeighted(Dx,Dy,0)

# plt.subplot(1,3,1),plt.imshow(Dx,'gray'),plt.title('Dx')
# plt.subplot(1,2),plt.imshow(Dy,plt.title('Dy')
# plt.subplot(1,3),plt.imshow(M,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,3.14/180,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),thickness=2)
original = cv2.cvtColor(original,cv2.COLOR_BGR2RGB)
plt.figure(),plt.imshow(original,'gray')


plt.show()

注意:您可以取消注释行以显示每个步骤的结果!我只是为了便于阅读而评论它们.

结果

注意:如果您知道罐头的纵横比,可以更好地修复它!

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读