我的想法是使用 Raspberry Pi 流式传输视频,Django 将为此承担重任。在 另一个进程 ,我还将运行一些 Celery 工作人员,它们每 5 秒从同一个相机捕获一张图片并将图片发送到公共(public)服务器。
Django 服务器将以 python manage.py runserver
启动
celery worker 将从 celery -A videoclient worker -l info -B --scheduler django_celery_beat.schedulers:DatabaseScheduler
开始
以下是访问相机的代码。由于只有一个摄像头,并且两个独立的进程要访问它,我该如何制作 self.video = cv2.VideoCapture(0)
行等待相机空闲而不是抛出异常?对于我的要求,高延迟是可以接受的。
相机代码
import cv2
class VideoCamera(object):
def get_frame(self):
try:
self.video = cv2.VideoCapture(0)
success, image = self.video.read()
self.video.release()
ret, jpeg = cv2.imencode('.jpg', image)
return jpeg.tobytes()
finally:
self.video.release()
video_camera = VideoCamera()
def gen(camera):
while True:
frame = camera.get_frame()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
在本地浏览器上流式传输:
from django.contrib import admin
from django.http import StreamingHttpResponse
from django.urls import path
from videoclient.camera import video_camera, gen
urlpatterns = [
path('monitor/', lambda r: StreamingHttpResponse(gen(video_camera),
content_type='multipart/x-mixed-replace; boundary=frame')),
path('admin/', admin.site.urls),
]
celery :
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, shared_task
from django.conf import settings
from videoclient.camera import video_camera
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'videoclient.settings')
app = Celery('videoclient')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
@shared_task
def uploadimage():
image = video_camera.get_frame()
# Upload the image to server
最佳答案
目前,您有 2 个进程正在运行 get_frame(),这会导致相机拍照。如果其中两个同时调用相机,可能会导致错误。
相反,请尝试这种方法:
1) 在主线程中,让相机循环拍摄照片,并使用最新帧更新变量 self.latestFrame。
2) 任何想要获取最新帧的进程都会获取 self.latestFrame 变量 没有 访问相机。
换句话说,您只有一个相机对象和一个拍照过程。该进程更新一个变量,任何其他进程都可以访问该变量而不会引起问题。
关于django - Python opencv等待相机空闲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59510664/