栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

基于野火EBF6ULL的远程调用摄像头监控方法

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于野火EBF6ULL的远程调用摄像头监控方法

  • 平台:野火EBF6ULL开发板

  • 系统:Debian (imx6ull-lubancat-carp-console-armhf-2022-02-10.img)

  • python版本:python 3.7

  • 摄像头:HBVCAM的OV5640免驱摄像头

  • 终端:MobaXterm

1.使用MobaXterm SSH远程登陆开发板

SSH终端通过开发板的以太网或WiFi的IP地址都可以连接,也可使用主机名。

  • 开发板的默认主机名为: npi ,使用主机名登录前先再开发板上运行安装 sudo apt install avahi-daemon 。

  • IP默认由路由动态分配,可先通过串口终端连接,使用 ifconfig命令 查看具体IP。

1、上电启动开发板,开发板默认开启ssh服务。系统正常登录后,输入以下命令查看ssh服务是否已经运行:

sudo systemctl status ssh

 active(running)表示ssh正常运行

2、确保网络连接正常(注意wifi要先正确配置后才能使用)。输入以下命令查看当前主机的ip地址:

ifconfig

3、点击菜单栏 「sessions」 –> 「new session」,弹出 「session setting」 对话框,选择SSH:

 4、在Remote host中填入开发板连接网络后使用的IP地址或者开发板的默认主机名**npi**,在Specify username打钩后,可以先填好登录名**debian**,如果不填则之后手动先输入登录名。 点击下面的OK开始连接。

5、成功连接上后会要求输入登录名密码**temppwd**,当密码输入正确回车后,会弹出一个窗口,这里直接点关闭不影响。

 2.编写python代码
RtspCapture.py
import os
import cv2
import time
import threading
import queue
from markupsafe import escape

class RtspCapture(object):
    read_thread = None  # background thread that reads frames from camera
    get_thread = None  # 从imglist中获取帧的进程
    pop_frame = None  # current frame is stored here by background thread
    last_access = 0  # time of last client access to the camera
    imgList = None
    url = "rtsp://admin:admin888@192.168.1.64:554/h264/ch1/sub/av_stream"
    top = 100
    lock = None

    def __init__(self):
        top = 100

    def start(self):
        # self.imgList = Manager().list()
        self.imgList = queue.Queue(self.top)
        self.lock = threading.Lock()
        if self.read_thread is None:
            # start background frame thread
            self.read_thread = threading.Thread(target=self.read)
            self.read_thread.start()

        if self.get_thread is None:
            self.last_access = time.time()
            self.get_thread = threading.Thread(target=self.get_frame)
            self.get_thread.start()

    def set_url(self, src):
        self.url = src

    # 向共享缓冲栈中写入数据:
    def read(self):
        print('Process to write: %s' % os.getpid())
        cap = cv2.VideoCapture(1)  //本文使用的video1
        while True:
            _, img = cap.read()
            if _:
                if self.imgList.full():
                    self.imgList.get()
                self.imgList.put(img)

    # 在缓冲栈中读取数据:
    def get_frame(self):
        print('Process to get: %s' % os.getpid())
        while True:
            if not self.imgList.empty():
                self.lock.acquire()
                value = self.imgList.get(False)  # 非阻塞方法
                self.pop_frame = value
                self.lock.release()

    def cap_frame(self):
        if self.pop_frame is None:
            print('frame is None')
        else:
            # print('set frame')
            self.lock.acquire()
            jpg = cv2.imencode('.jpg', self.pop_frame)[1].tobytes()
            self.lock.release()
            return jpg
app.py
# -*-coding:utf-8-*-
from flask import Flask, render_template, Response
from RtspCapture import RtspCapture


app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html')


def gen(rtsp):
    while True:
        this_frame = rtsp.cap_frame()
        if this_frame is not None:
            yield (b'--framern'
                   b'Content-Type: image/jpegrnrn' + this_frame + b'rn')


@app.route('/video_feed')
def video_feed():
    cap = RtspCapture()
    cap.start()
    return Response(gen(cap),
                    mimetype='multipart/x-mixed-replace; boundary=frame')


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9011, threaded=True)  //flask的app.run()方法运行服务器应用,默认是只能在本机访问的!!!如果需要在其他机器上访问,需要修改为:app.run(host='0.0.0.0')

index.html


  
    Video Streaming Demonstration
  
  
    Video Streaming Demonstration
    { url_for('video_feed') }}" height="500">
  

将以上三个文件放进同一个文件夹,MobaXterm SSH连接成功后,左边会自动出现一个窗口显示开发板目录下的文件,可以用鼠标把文件拖放进去或者把板子文件拖放出来。将代码文件拖进去,我的文件名是flask-video。

 3.运行程序

首先使能摄像头设备。在fire-config中关闭LED插件,然后使能摄像头插件,插入免驱USB摄像头,重启开发板。

sudo fire-config

v4l-utils工具安装

 sudo apt install v4l-utils

 查看可用的视频设备,其中/dev/video1对应OV5640的物理设备

#执行命令
 v4l2-ctl --list-devices


#显示结果如下

i.MX6S_CSI (platform:21c4000.csi):
        /dev/video3

pxp (pxp_v4l2):
        /dev/video0

HBVCAM 5M-AF: HBVCAM 5M-AF (usb-ci_hdrc.1-1.1):  //usb-ci_hdrc.1-1.1表示插在usb1上
        /dev/video1
        /dev/video2

查看摄像头所有参数

 #执行命令
 sudo v4l2-ctl -d  /dev/video1 --all


 #显示信息如下
Driver Info:
        Driver name      : uvcvideo
        Card type        : HBVCAM 5M-AF: HBVCAM 5M-AF
        Bus info         : usb-ci_hdrc.1-1.1
        Driver version   : 4.19.35
        Capabilities     : 0x84a00001
                Video Capture
                Metadata Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
        Width/Height      : 640/480
        Pixel Format      : 'YUYV' (YUYV 4:2:2)
        Field             : None
        Bytes per Line    : 1280
        Size Image        : 614400
        Colorspace        : sRGB
        Transfer Function : Default (maps to sRGB)
        YCbCr/HSV Encoding: Default (maps to ITU-R 601)
        Quantization      : Default (maps to Limited Range)
        Flags             :
Crop Capability Video Capture:
        Bounds      : Left 0, Top 0, Width 640, Height 480
        Default     : Left 0, Top 0, Width 640, Height 480
        Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 640, Height 480, Flags:
Selection: crop_bounds, Left 0, Top 0, Width 640, Height 480, Flags:
Streaming Parameters Video Capture:
        Capabilities     : timeperframe
        Frames per second: 30.000 (30/1)
        Read buffers     : 0
                     brightness 0x00980900 (int)    : min=0 max=15 step=1 default=8 value=8
                       contrast 0x00980901 (int)    : min=0 max=15 step=1 default=8 value=8
                     saturation 0x00980902 (int)    : min=0 max=15 step=1 default=7 value=7
                            hue 0x00980903 (int)    : min=-10 max=10 step=1 default=0 value=0
 white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1
                          gamma 0x00980910 (int)    : min=1 max=10 step=1 default=10 value=10
           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=2 value=2
      white_balance_temperature 0x0098091a (int)    : min=2800 max=6500 step=1 default=2800 value=2800 flags=inactive
                      sharpness 0x0098091b (int)    : min=0 max=15 step=1 default=6 value=6
         backlight_compensation 0x0098091c (int)    : min=0 max=1 step=1 default=1 value=1
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3
              exposure_absolute 0x009a0902 (int)    : min=39 max=5000 step=1 default=1250 value=1250 flags=inactive
                 focus_absolute 0x009a090a (int)    : min=0 max=24 step=1 default=16 value=16 flags=inactive
                     focus_auto 0x009a090c (bool)   : default=1 value=1

查看摄像头所支持的分辨率

#执行命令
 sudo v4l2-ctl --list-formats-ext -d /dev/video1

 #显示信息如下

进入flask-video目录下

cd flask-video

运行:

python3 app.py

在pc端浏览器打开,在浏览器输入:http://192.168.1.102:9011

 结果如下,表示运行成功

4.报错处理

1.jinja2.exceptions.TemplateNotFound: index.html报错梳理

        1.模板没有存在templates目录下,或者目录名称错误

        2.应用即你服务的xxx.py文件,和templates没有在同一级别

 将index.html放在新建的templates文件夹下,templates文件夹和app.py在同一级别。

2.cannot import name 'escape' from 'jinja2'的问题

由于之前安装的flask版本是1.x.x的,该系列版本都是依赖Jinja的:from escape import Jinja
而版本2.x系列的放弃了对Jinja的依赖,所以只需要吧Flask更新到新版就行。

pip3 install Flask==2.1.0
3.127.0.0.1 拒绝了我们的连接请求

flask的app.run()方法运行服务器应用,默认是只能在本机访问的!!!如果需要在其他机器上访问,需要修改为:app.run(host='0.0.0.0')。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/894063.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号