import cv2
import numpy as np
def filter(img): #图像预处理
img_t = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(img_t)
v1 = np.clip(cv2.add(1*v,-120),0,255) #调整亮度和饱和度
s += 20
img1 = np.uint8(cv2.merge((h,s,v1)))
lower_red ,upper_red= np.array([0, 110, 120]),np.array([20, 200, 255]) #按照阈值过滤灯条
img1 = cv2.dilate(cv2.inRange(img1, lower_red, upper_red), np.ones((5, 5), np.uint8), iterations=1) #膨胀,便于轮廓识别
contours, hierarchy = cv2.findContours(img1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) #识别轮廓
center=[]
for contour in contours: # 求轮廓中心
M = cv2.moments(contour) # 计算轮廓的矩
center_x = int(M["m10"] / M["m00"]) # 计算中心点的x和y坐标
center_y = int(M["m01"] / M["m00"])
center.append([center_x,center_y])
cv2.circle(img, (center_x, center_y), 5, (255, 255, 0), -1)# 在图像上绘制中心点
midpoints = []
for i in range(len(center)): #找到符合条件的中点
for j in range(i+1, len(center)):
if abs(center[i][1] - center[j][1]) < 5: #用纵坐标之差过滤,同一装甲板的灯条都是平行的
midpoint_x = (center[i][0] + center[j][0]) / 2
midpoint_y = (center[i][1] + center[j][1]) / 2
midpoints.append([midpoint_x, midpoint_y])
if midpoints is not []:
for point in midpoints: #输出并绘制
print(point)
cv2.circle(img, (round(point[0]),round(point[1])), 12, (255, 0, 255), -1)
img=cv2.drawContours(img, contours, -1, (0, 255, 0), 2) #可以删这行
return img
video_capture = cv2.VideoCapture('./test.mp4')
while cv2.waitKey(1) is not ord('q'):
ret, frame = video_capture.read()
if not ret:
break
img=filter(frame)
cv2.imshow('Video',img )
video_capture.release()
cv2.destroyAllWindows()