python - 来自多个摄像头的 OpenCV 多线程捕获
问题描述
我正在开发一个使用 OpenCV4 (python3) 和多个摄像头进行多线程捕获的安全项目。每个相机(帧)单独处理以进行对象检测,最后将它们流式传输到网络。由于python没有“案例”而且我正在这样做,它是正确的方法还是优化的方法是什么?
<code>
# this is the start function
def start_cams():
...
# get list of active cams
cam_active = get_camera() # i.e. 4 cameras
for i in range(len(cam_active)):
t = threading.Thread(target=process_cam, name=cam_active[i],
args=(cam_active[i],))
t.daemon = True
t.start()
# this is the capture and process function
def process_cam(cam_id):
global lock, vs_cam_1, vs_cam_2, vs_cam_3, vs_cam_4
global out_1, out_2, out_3, out_4
...
if cam_id == "cam_4":
vs_cam_4 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
elif cam_id == "cam_3":
vs_cam_3 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
elif cam_id == "cam_2":
vs_cam_2 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
elif cam_id == "cam_1":
vs_cam_1 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
...
# object detection code here
...
with lock:
if cam_id == "cam_4":
out_4 = frame.copy()
elif cam_id == "cam_3":
out_3 = frame.copy()
elif cam_id == "cam_2":
out_2 = frame.copy()
elif cam_id == "cam_1":
out_1 = frame.copy()
# this is the output stream function
def generate_stream(cam_id):
global lock, out_1, out_2, out_3, out_4
while True:
with lock:
if cam_id == "cam_1":
...
# encode the frame in JPEG format
(flag, encodedFrame) = cv2.imencode(".jpg", out_1)
...
yield(b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + \
bytearray(encodedFrame) + b'\r\n')
</code>
解决方案
推荐阅读
- c++ - 智能指针的铸造
- r - R如何使用带有过滤器或过滤器_的卷曲卷曲?
- json - 当 jsonb 效率更高时,为什么 PostgreSQL 保留 json 字段?
- apache-atlas - can i restore soft deleted entity in apache atlas?
- java - 我无法使用 ip addr 连接 ldap 服务器
- javascript - 使用 forEach 过滤 JSON 对象
- python - 使用一列中的多个值过滤数据框中的值
- google-app-engine - APP Engine:OAuth 客户端被删除?
- react-native - 如何解决 assembleRelease 上的 react-native-immediate-phone-call 错误
- flutter - 当 defaultRender 设置为非常基本的 ArcRendererConfig() 时,Flutter GoogleChart 饼图不呈现