-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmp_01.py
More file actions
146 lines (120 loc) · 4.42 KB
/
Copy pathmp_01.py
File metadata and controls
146 lines (120 loc) · 4.42 KB
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import multiprocessing
import time
from NewCode import code
from detect import *
from FPS.utils import FPS
from loguru_config.config import *
def process_line(input_queue, output_queue, src2=0, src3=0):
"""
巡线进程函数
:param input_queue: 输入队列,包括frame以及frame_count
:param output_queue: 输出队列,将子数据编码后发出
:param src2: 子数据2,初始值为0
:param src3: 子数据3,初始值为0
:return: output_queue 输出队列
"""
while True:
# 超时判断,若队列接受超时,将退出while循环并在输出队列put None终结队列
try:
pdata = input_queue.get(timeout=2)
except multiprocessing.queues.Empty:
break
if pdata is None:
break
(img, img_count) = pdata
output_queue.put(code.encode(img_count, src2, src3))
output_queue.put(None)
def process_find(input_queue, output_queue, src2=0, src3=0):
"""
检测进程函数
:param input_queue: 输入队列,包括frame以及frame_count
:param output_queue: 输出队列,将子数据编码后发出
:param src2: 子数据2,初始值为0
:param src3: 子数据3,初始值为0
:return: output_queue 输出队列
"""
while True:
# 超时判断,若队列接受超时,将退出while循环并在输出队列put None终结队列
try:
pdata = input_queue.get(timeout=2)
except multiprocessing.queues.Empty:
break
if pdata is None:
break
(img, img_count) = pdata
output_queue.put(code.encode(img_count, src2, src3))
output_queue.put(None)
def process_combine(input1_queue, input2_queue, output_queue):
"""
数据整合进程,将巡线与检测进程传来的数据进行综合处理编码后在输出队列put
:param input1_queue: 输入队列1,接收队列1的数据
:param input2_queue: 输入队列2,接收队列1的数据
:param output_queue: 输出队列,将子数据编码后发出
:return: output_queue 输出队列
"""
while True:
# 超时判断,若队列接受超时,将退出while循环并在输出队列put None终结队列
try:
data1 = input1_queue.get(timeout=2)
data2 = input2_queue.get(timeout=2)
except multiprocessing.queues.Empty:
break
if data1 is None or data2 is None:
break
src11, src12, src13 = code.decode(data1)
src21, src22, src23 = code.decode(data2)
output_queue.put(code.encode(src11, src12, src23))
output_queue.put(None)
if __name__ == "__main__":
setlog()
start_time = time.time()
fps = FPS().start()
frame_count = 0
# 队列初始化
line_input = multiprocessing.Queue()
find_input = multiprocessing.Queue()
line_output = multiprocessing.Queue()
find_output = multiprocessing.Queue()
combine_output = multiprocessing.Queue()
# 进程初始化
pl = multiprocessing.Process(target=process_line, args=(line_input, line_output))
pf = multiprocessing.Process(target=process_find, args=(find_input, find_output))
pc = multiprocessing.Process(target=process_combine, args=(line_output, find_output, combine_output))
# 进程启动
pl.start()
pf.start()
pc.start()
cap = cv2.VideoCapture('../Material/pgv11.mp4')
if not cap.isOpened():
print("Error: Cannot open video")
while True:
ret, frame = cap.read()
if not ret:
exit()
frame_count += 1
# 将数据以元组形式一起发出
data = (frame, frame_count)
line_input.put(data)
find_input.put(data)
cv2.imshow('frame', frame)
data_return = combine_output.get()
# 避免前期接受空数据
if frame_count > 40:
if data_return is None:
break
print(f'\rframe_count: {frame_count} data_return: {code.decode(data_return)} '
f'{data_return:b}', end=' ')
if cv2.waitKey(1) & 0xFF == ord('q'):
break
fps.update()
fps.stop()
# 进程终止
line_input.put(None)
find_input.put(None)
pl.join()
pf.join()
line_output.put(None)
find_output.put(None)
pc.join()
cap.release()
cv2.destroyAllWindows()