-
平台:野火EBF6ULL开发板
-
系统:Debian (imx6ull-lubancat-carp-console-armhf-2022-02-10.img)
-
python版本:python 3.7
-
摄像头:HBVCAM的OV5640免驱摄像头
-
终端:MobaXterm
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.03.127.0.0.1 拒绝了我们的连接请求
flask的app.run()方法运行服务器应用,默认是只能在本机访问的!!!如果需要在其他机器上访问,需要修改为:app.run(host='0.0.0.0')。



