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

python – 在opencv中检测罐子或瓶子,第1张

概述我是OpenCV的新手并且有一些问题.我需要根据它们的形状检测瓶子罐子.为此我使用了覆盆子pi板和pi相机.背景总是黑色,不会改变.我已经尝试了很多可能的解决方案来解决这个问题但是无法获得满意的结我尝试过的东西包括边缘检测,形态转换,matchShapes(),matchTemplate().如果我能够有效且最准确地完成这项任务,请告诉我. 示例图片: 我想出了一个可能有帮助的方法!如果您了解罐 我是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 * 2hsv_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.@R_310_3017@(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()

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

结果

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

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

总结

以上是内存溢出为你收集整理的python – 在opencv中检测罐子或瓶子全部内容,希望文章能够帮你解决python – 在opencv中检测罐子或瓶子所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1204937.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存