示例图片:
解决方法 我想出了一个可能有帮助的方法!如果您了解罐头的更多信息,即宽高比,通过调整矩形尺寸可以更加稳固!途径
>将图像转换为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中检测罐子或瓶子所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)