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

编程入门 行业动态 更新时间:2024-10-21 16:33:25

基于<a href=https://www.elefans.com/category/jswz/34/1756816.html style=野火EBF6ULL的远程调用摄像头监控方法"/>

基于野火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 escapeclass RtspCapture(object):read_thread = None  # background thread that reads frames from cameraget_thread = None  # 从imglist中获取帧的进程pop_frame = None  # current frame is stored here by background threadlast_access = 0  # time of last client access to the cameraimgList = Noneurl = "rtsp://admin:admin888@192.168.1.64:554/h264/ch1/sub/av_stream"top = 100lock = Nonedef __init__(self):top = 100def 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 threadself.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)  //本文使用的video1while 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 = valueself.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 RtspCaptureapp = 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'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + this_frame + b'\r\n')@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

<html><head><title>Video Streaming Demonstration</title></head><body><h1>Video Streaming Demonstration</h1><img src="{{ url_for('video_feed') }}" height="500"></body>
</html>

将以上三个文件放进同一个文件夹,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/video3pxp (pxp_v4l2):/dev/video0HBVCAM 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      : uvcvideoCard type        : HBVCAM 5M-AF: HBVCAM 5M-AFBus info         : usb-ci_hdrc.1-1.1Driver version   : 4.19.35Capabilities     : 0x84a00001Video CaptureMetadata CaptureStreamingExtended Pix FormatDevice CapabilitiesDevice Caps      : 0x04200001Video CaptureStreamingExtended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:Width/Height      : 640/480Pixel Format      : 'YUYV' (YUYV 4:2:2)Field             : NoneBytes per Line    : 1280Size Image        : 614400Colorspace        : sRGBTransfer 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 480Default     : Left 0, Top 0, Width 640, Height 480Pixel 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     : timeperframeFrames per second: 30.000 (30/1)Read buffers     : 0brightness 0x00980900 (int)    : min=0 max=15 step=1 default=8 value=8contrast 0x00980901 (int)    : min=0 max=15 step=1 default=8 value=8saturation 0x00980902 (int)    : min=0 max=15 step=1 default=7 value=7hue 0x00980903 (int)    : min=-10 max=10 step=1 default=0 value=0white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1gamma 0x00980910 (int)    : min=1 max=10 step=1 default=10 value=10power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=2 value=2white_balance_temperature 0x0098091a (int)    : min=2800 max=6500 step=1 default=2800 value=2800 flags=inactivesharpness 0x0098091b (int)    : min=0 max=15 step=1 default=6 value=6backlight_compensation 0x0098091c (int)    : min=0 max=1 step=1 default=1 value=1exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3exposure_absolute 0x009a0902 (int)    : min=39 max=5000 step=1 default=1250 value=1250 flags=inactivefocus_absolute 0x009a090a (int)    : min=0 max=24 step=1 default=16 value=16 flags=inactivefocus_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')。

更多推荐

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

本文发布于:2024-02-14 09:04:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1762823.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:野火   摄像头   方法   EBF6ULL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!