赞
踩
说明
如果图像中存在多个干扰槽,并且我们只想找到与滑块最匹配的槽,我们可以通过一些额外的策略来实现。一种方法是计算每个槽与滑块的距离,并选择距离最近的那个作为最匹配的槽
代码
-
- import cv2
- import numpy as np
-
-
- def calculate_distance(cx_slider, cy_slider, cx_slot, cy_slot):
- # 计算滑块到滑块槽的欧氏距离
- distance = np.sqrt((cx_slider - cx_slot) ** 2 + (cy_slider - cy_slot) ** 2)
- return distance
-
-
- # 读取图片
- image = cv2.imread('tp1.png')
- # 将图片转换为灰度图像
- gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
- # 通过阈值处理获取二值图像
- _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
- # 轮廓检测
- contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
-
- if len(contours) >= 2:
- # 找到最大的轮廓(滑块)
- max_contour = max(contours, key=cv2.contourArea)
- # 创建一个新的轮廓列表,不包含最大轮廓
- contours = [contour for contour in contours if contour is not max_contour]
-
- min_distance = float('inf') # 初始化最小距离为无穷大
- best_slot = None
-
- # 遍历所有可能的槽
- for slot_contour in contours:
- # 计算滑块的质心
- M1 = cv2.moments(max_contour)
- cx_slider = int(M1['m10'] / M1['m00'])
- cy_slider = int(M1['m01'] / M1['m00'])
-
- # 计算滑块槽的质心
- M2 = cv2.moments(slot_contour)
- if M2['m00'] != 0:
- cx_slot = int(M2['m10'] / M2['m00'])
- cy_slot = int(M2['m01'] / M2['m00'])
-
- # 计算滑块到滑块槽的欧氏距离
- distance = calculate_distance(cx_slider, cy_slider, cx_slot, cy_slot)
-
- # 更新最小距离和最匹配的槽
- if distance < min_distance:
- min_distance = distance
- best_slot = slot_contour
- else:
- print("找不到滑块槽")
-
- if best_slot is not None:
- print("最匹配的滑块槽距离:", min_distance)
- else:
- print("找不到最匹配的滑块槽")
- else:
- print("找不到足够的轮廓")
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。