首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待相机免费

等待相机免费
EN

Stack Overflow用户
提问于 2019-12-28 11:56:52
回答 1查看 662关注 0票数 0

我的想法是使用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)等待相机是免费的,而不是抛出一个异常?对于我的要求,高延迟是可以接受的。

摄象机代码

代码语言:javascript
复制
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')

本地浏览器上的流:

代码语言:javascript
复制
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),

]

芹菜:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-12-28 22:45:15

目前有两个进程运行get_frame(),这会导致照相机拍照。如果他们中的两个人同时调用相机,就会导致错误。

相反,尝试以下方法:

( 1)在主线程中,让摄像机在循环中拍照,并使用最新的帧更新变量self.latestFrame。

2)任何想获得最新帧的进程都会得到self.latestFrame变量,,而不需要访问摄像机。

换句话说,你只有一个相机对象和一个拍摄过程。该进程更新一个变量,任何其他进程都可以访问该变量而不会引起问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59510664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档