ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Python】【OpenCV】定位条形码(二) [打印本页]

作者: 笑看天下无敌手    时间: 2024-2-29 22:23
标题: 【Python】【OpenCV】定位条形码(二)
  根据上一篇博客可知,单纯的通过求取最大面积而进行定位的局限性,因此我们接下来将通过cv2.moments()和cv2.HuMoments()这两个方法来在更复杂的环境中去找到我们的目标区域。
 
cv2.moments():
参数:
返回值:
cv2.HuMoments():
参数:
返回值:
 
  简易的介绍一下moments(矩)这个东西,它是用来描述一个形状的特性,比如说正方形,我们能分辨出来是因为知道其四个边是相等的,这便是在我们的认知中所知的正方形的轮廓特性,
而在计算机中呈现的就是一组数据,通过和这组数据进行比对,我们就可以较为准确的去寻找我们的目标区域。
  但是相较于上一篇博客的直接在输入图像中查找,使用矩我们需要事先获取目标的完整轮廓,并保存其矩特性数据。
 
图像准备,一张没有完整的只有barcode的图像

 
 
Code:
  1. 1 import cv2
  2. 2 import numpy
  3. 3
  4. 4 img = cv2.imread('../images/barcode.jpg')
  5. 5 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  6. 6 kernel_x = numpy.array(
  7. 7     [
  8. 8         [-1, 0, 1],
  9. 9         [-2, 0, 2],
  10. 10         [-1, 0, 1]
  11. 11     ]
  12. 12 )
  13. 13 sobel_x = cv2.filter2D(gray, -1, kernel_x)
  14. 14 _, thresh = cv2.threshold(sobel_x, 127, 255, cv2.THRESH_BINARY)
  15. 15 kernel_ed = numpy.ones((3, 3), dtype=numpy.uint8)
  16. 16 img_d = cv2.dilate(thresh, kernel_ed, iterations=6)
  17. 17 contours, hir = cv2.findContours(img_d, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  18. 18 print(cv2.HuMoments(cv2.moments(contours[0])))
  19. 19 cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
  20. 20 cv2.imshow('', img)
  21. 21 cv2.waitKey()
  22. 22 cv2.destroyAllWindows()
复制代码
Result:
 

 
我就直接和上一篇博客的barcode的轮廓矩特性进行对比:
    只有barcode图       包含其他图形的barcode图

 
 通过对比数据我们可以发现,在第1不变矩中,数据是最接近的,这个时候就可以利用这个特性数据来进行轮廓特征比对寻找目标区域。
当然因为OpenCV提供了一个方法为我们减免了比较的操作cv2.matchShapes()方法。
 
cv2.matchShapes()
参数:
返回值:
 
至此,当我们所得到的图像源包含了其他复杂的图形时,我们则可以使用矩特性来进一步提高我们的检测能力,但是还有其他更为复杂的场景,所以还需要优化我们的解决思路。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4