野火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的远程调用摄像头监控方法
发布评论