我的想法是使用Raspberry Pi流视频,Django将为其做繁重的工作。在另一个进程中,我还将运行一些芹菜工作人员,他们每5秒从同一个摄像机捕捉一张照片,并将照片发送到公共服务器。
Django服务器将使用python manage.py runserver启动
芹菜工人将从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),]
芹菜:
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发布于 2019-12-28 22:45:15
目前有两个进程运行get_frame(),这会导致照相机拍照。如果他们中的两个人同时调用相机,就会导致错误。
相反,尝试以下方法:
( 1)在主线程中,让摄像机在循环中拍照,并使用最新的帧更新变量self.latestFrame。
2)任何想获得最新帧的进程都会得到self.latestFrame变量,,而不需要访问摄像机。
换句话说,你只有一个相机对象和一个拍摄过程。该进程更新一个变量,任何其他进程都可以访问该变量而不会引起问题。
https://stackoverflow.com/questions/59510664
复制相似问题