当前位置:   article > 正文

滑块槽位最优寻找

滑块槽位最优寻找

说明

如果图像中存在多个干扰槽,并且我们只想找到与滑块最匹配的槽,我们可以通过一些额外的策略来实现。一种方法是计算每个槽与滑块的距离,并选择距离最近的那个作为最匹配的槽

代码

  1. import cv2
  2. import numpy as np
  3. def calculate_distance(cx_slider, cy_slider, cx_slot, cy_slot):
  4. # 计算滑块到滑块槽的欧氏距离
  5. distance = np.sqrt((cx_slider - cx_slot) ** 2 + (cy_slider - cy_slot) ** 2)
  6. return distance
  7. # 读取图片
  8. image = cv2.imread('tp1.png')
  9. # 将图片转换为灰度图像
  10. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  11. # 通过阈值处理获取二值图像
  12. _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
  13. # 轮廓检测
  14. contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  15. if len(contours) >= 2:
  16. # 找到最大的轮廓(滑块)
  17. max_contour = max(contours, key=cv2.contourArea)
  18. # 创建一个新的轮廓列表,不包含最大轮廓
  19. contours = [contour for contour in contours if contour is not max_contour]
  20. min_distance = float('inf') # 初始化最小距离为无穷大
  21. best_slot = None
  22. # 遍历所有可能的槽
  23. for slot_contour in contours:
  24. # 计算滑块的质心
  25. M1 = cv2.moments(max_contour)
  26. cx_slider = int(M1['m10'] / M1['m00'])
  27. cy_slider = int(M1['m01'] / M1['m00'])
  28. # 计算滑块槽的质心
  29. M2 = cv2.moments(slot_contour)
  30. if M2['m00'] != 0:
  31. cx_slot = int(M2['m10'] / M2['m00'])
  32. cy_slot = int(M2['m01'] / M2['m00'])
  33. # 计算滑块到滑块槽的欧氏距离
  34. distance = calculate_distance(cx_slider, cy_slider, cx_slot, cy_slot)
  35. # 更新最小距离和最匹配的槽
  36. if distance < min_distance:
  37. min_distance = distance
  38. best_slot = slot_contour
  39. else:
  40. print("找不到滑块槽")
  41. if best_slot is not None:
  42. print("最匹配的滑块槽距离:", min_distance)
  43. else:
  44. print("找不到最匹配的滑块槽")
  45. else:
  46. print("找不到足够的轮廓")

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/554026
推荐阅读
相关标签
  

闽ICP备14008679号