首先通过cv2识别hsv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import cv2
import numpy as np

def empty(v):
# 回调函数,暂时不进行任何操作
pass

rtsp_url = "rtsp://admin:[email protected]:554/h264/ch1/main/av_stream" # 替换为你的RTSP流URL
cap = cv2.VideoCapture(rtsp_url)

cv2.namedWindow('TrackBar')
cv2.resizeWindow('TrackBar', 640, 320)

# 创建调节滑动条
cv2.createTrackbar('Hue Min', 'TrackBar', 0, 179, empty)
cv2.createTrackbar('Hue Max', 'TrackBar', 179, 179, empty)
cv2.createTrackbar('Sat Min', 'TrackBar', 0, 255, empty)
cv2.createTrackbar('Sat Max', 'TrackBar', 255, 255, empty)
cv2.createTrackbar('Val Min', 'TrackBar', 0, 255, empty)
cv2.createTrackbar('Val Max', 'TrackBar', 255, 255, empty)

while True:
h_min = cv2.getTrackbarPos('Hue Min', 'TrackBar')
h_max = cv2.getTrackbarPos('Hue Max', 'TrackBar')
s_min = cv2.getTrackbarPos('Sat Min', 'TrackBar')
s_max = cv2.getTrackbarPos('Sat Max', 'TrackBar')
v_min = cv2.getTrackbarPos('Val Min', 'TrackBar')
v_max = cv2.getTrackbarPos('Val Max', 'TrackBar')

print(h_min, h_max, s_min, s_max, v_min, v_max)

ret, img = cap.read()
if not ret:
break
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower = np.array([h_min, s_min, v_min])
upper = np.array([h_max, s_max, v_max])

# 使用颜色阈值进行图像分割
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(img, img, mask=mask)

cv2.imshow('img', img)
cv2.imshow('mask', mask)
cv2.imshow('reslut', result)
cv2.waitKey(1)

通过rtsp进行链接

通过rtsp进行链接监控摄像头来进行识别监控上图像来进行识别区域hsv,实时抓流。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import cv2
import numpy as np

# 定义颜色阈值
green_lower = np.array([102, 154, 171]) # 绿色范围低阈值
green_upper = np.array([112, 208, 255]) # 绿色范围高阈值
red_lower = np.array([117, 110, 160]) # 红色范围低阈值
red_upper = np.array([178, 173, 209]) # 红色范围高阈值
area_decrease_threshold = 500 # 设置面积减少阈值

# 初始化计数器
count_green = 0
count_red = 0
last_green_area = 0
last_red_area = 0

# 打开RTSP视频流
rtsp_url = "rtsp://admin:[email protected]:554/h264/ch1/main/av_stream" # 替换为你的RTSP流URL
cap = cv2.VideoCapture(rtsp_url)

# 当前代码段是一个无限循环,持续从摄像头中读取帧
while True:
ret, frame = cap.read() # 通过cap.read()方法读取摄像头帧

if not ret: # 如果ret为False,表示未能成功读取帧
break # 退出循环

# 转换为HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

# 阈值处理
mask_green = cv2.inRange(hsv, green_lower, green_upper)
mask_red = cv2.inRange(hsv, red_lower, red_upper)

# 平滑处理
mask_green = cv2.GaussianBlur(mask_green, (5, 5), 0)
mask_red = cv2.GaussianBlur(mask_red, (5, 5), 0)

# 查找轮廓
contours_green, _ = cv2.findContours(mask_green, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours_red, _ = cv2.findContours(mask_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算绿色和红色区域面积
green_area = cv2.contourArea(contours_green[0]) if len(contours_green) > 0 else 0
red_area = cv2.contourArea(contours_red[0]) if len(contours_red) > 0 else 0

# 检查绿色线条面积减少
if last_green_area != 0 and green_area < last_green_area - area_decrease_threshold:
print("Green area decreased significantly")
last_green_area = green_area

# 检查红色线条面积减少
if last_red_area != 0 and red_area < last_red_area - area_decrease_threshold:
print("Red area decreased significantly")
last_red_area = red_area

# 绘制结果
frame = cv2.drawContours(frame, contours_green, -1, (0, 255, 0), 2, cv2.LINE_AA)
frame = cv2.drawContours(frame, contours_red, -1, (0, 0, 255), 2, cv2.LINE_AA)

# 显示结果
cv2.imshow("Detection", frame)

if cv2.waitKey(1) & 0xFF == 27:
break

# 释放资源
cap.release()
cv2.destroyAllWindows()