django - Python opencv等待相机空闲

标签 django opencv celery

我的想法是使用 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/

相关文章:

python - Django 基于类的 CreateView 中的表单集

opencv - RGB转灰度

Django Celery 多个工作线程和多个队列

Django:没有这样的表:django_session

Django 更改中间件中的 request.path(通过 url 中的 token 进行身份验证)

opencv - 如何进行肤色匹配

Django Celery 接收和接受任务,但不执行它们

rabbitmq - 如何修复这个rabbitmq/celery错误?

使用 kwargs 时的 Python 2 和 3 元类兼容性

c++ - QT CQTDeployer无法运行: config/controlScript.js (SOLVED)