我在rasbpberrypi3上运行了简单的python脚本。此脚本负责打开视频设备并使用MJPEG将数据(800x600)流式传输到HTTP端点。当我接收到这个流时,我的一个rasbpberrypi内核可以100%工作。可以用多线程运行OpenCV吗?在
这是我的密码
import cv2
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import time
import argparse
import socket as Socket
camera = None
def setUpCameraCV():
global camera
camera = cv2.VideoCapture(0)
class mjpgServer(BaseHTTPRequestHandler):
ip = None
hostname = None
def do_GET(self):
print('connection from:', self.address_string())
if self.ip is None or self.hostname is None:
self.ip, _ = 0.0.0.0
self.hostname = Socket.gethostname()
if self.path == '/mjpg':
self.send_response(200)
self.send_header('Cache-Control', 'no-cache')
self.send_header('Pragma', 'no-cache')
self.send_header('Connection', 'close')
self.send_header(
'Content-type',
'multipart/x-mixed-replace; boundary=mjpegstream'
)
self.end_headers()
while True:
if camera:
ret, img = camera.read()
else:
raise Exception('Error, camera not setup')
if not ret:
print('no image from camera')
time.sleep(1)
continue
ret, jpg = cv2.imencode('.jpg', img)
self.end_headers()
self.wfile.write('--mjpegstream')
self.end_headers()
self.send_header('Content-type', 'image/jpeg')
self.send_header('Content-length', str(jpg.size))
self.end_headers()
self.wfile.write(jpg.tostring())
def main():
try:
setUpCameraCV()
mjpgServer.ip = 0.0.0.0
mjpgServer.hostname = Socket.gethostname()
server = HTTPServer((ipv4, args['port']), mjpgServer)
print("server started on {}:{}".format(Socket.gethostname(), args['port']))
server.serve_forever()
except keyboardInterrupt:
print('KeyboardInterrupt')
server.socket.close()
if __name__ == '__main__':
main()
另一个问题是,如何在客户端(接收器)获取每帧的时间戳?在
使用线程处理I/O繁重的操作(例如从网络摄像头读取帧)是一种经典的编程模型。由于使用
cv2.VideoCapture().read()
访问网络摄像头/摄像头是一个阻塞操作,因此我们的主程序将暂停,直到帧从摄像机设备读取并返回到脚本。基本上,这个想法是生成另一个线程来处理以并行的方式抓取帧,而不是依赖于单个线程(我们的“主”线程)以顺序顺序抓取帧。这将允许从I/O线程连续读取帧,而我们的根线程处理当前帧。一旦根线程处理完它的帧,它只需要从I/O线程获取当前帧,而不必等待阻塞I/O操作。在因此,我们可以通过创建一个新线程来提高性能,该线程只轮询新帧,而主线程处理当前帧。对于处理多个摄影机流的实现,请看一下capture multiple camera streams with OpenCV
相关问题 更多 >
编程相关推荐