说明
如果图像中存在多个干扰槽,并且我们只想找到与滑块最匹配的槽,我们可以通过一些额外的策略来实现。一种方法是计算每个槽与滑块的距离,并选择距离最近的那个作为最匹配的槽
代码
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("找不到足够的轮廓")