利用ZYBO-Z7实验板完成摄像头画面读取

平台信息

  • 目标内核版本:Linux version 4.19.0-xilinx-v2019.1 (oe-user@oe-host) (gcc
    version 8.2.0 (GCC)) #1 SMP PREEMPT Tue Nov 5 08:44:09 UTC 2019

  • 目标系统版本:Distributor ID: Debian

Description: Debian GNU/Linux 9.11 (stretch)

Release: 9.11

Codename: stretch

任务记录

  1. 因为任务决定使用ZYBOZ7的PS的arm核加上操作系统来处理,因此PL端只需要有一个最简逻辑即可。使用vivado生成ZYBOZ7的对应工程,在系统设计里确认USB,ENET,UART已启用。随后生成bit文件和.hdl硬件描述文件以便下一步的配置。

配置图

  1. 使用Petalinux导入上一步生成的hdf文件来创建工程。
    使用petalinux-create -t project -n newtest --template
    zynq命令来创建工程,随后通过petalinux-config --get-hw-description design.hdf命令指定hdf文件。指定文件后会弹出配置界面,.在配置中选择sd卡文件系统

Image packaing configration–>file system type or rootfs(I forgot
it…)–> SD card

  1. *为系统内核添加USB设备树以便使用USB设备(非必须)
    首先在工程里使用petalinux-config -c kernel
    生成内核配置菜单,因为改动较多所以直接使用修改文件来配置内核,在弹出的配置彩蛋可以直接退出,随后找到工程里的project-spec/meta-user/recipes-kernel/linux/linux-xlnx/*.cfg文件,在文件里添加如下配置
CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_USB_VIDEO_CLASS=y
CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
CONFIG_USB_GSPCA=m
CONFIG_V4L_PLATFORM_DRIVERS=y
CONFIG_VIDEO_ADV7604=y
CONFIG_USB_HID=y
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_DEFAULT_PERSIST=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_PCI=y
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_ACM=m
CONFIG_USB_PRINTER=m
CONFIG_USB_WDM=m
CONFIG_USB_TMC=m
CONFIG_USB_STORAGE=y
CONFIG_USB_CHIPIDEA=y
CONFIG_USB_CHIPIDEA_OF=y
CONFIG_USB_CHIPIDEA_PCI=y
CONFIG_USB_CHIPIDEA_HOST=y
CONFIG_USB_PHY=y
CONFIG_NOP_USB_XCEIV=y
CONFIG_AM335X_CONTROL_USB=y
CONFIG_AM335X_PHY_USB=y
CONFIG_USB_GPIO_VBUS=y
CONFIG_USB_ULPI=y
CONFIG_USB_ULPI_VIEWPORT=y

然后在设备树文件project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi里添加如下代码:

/{
 usb_phy0: usb_phy@0 {
  compatible = "ulpi-phy";
  #phy-cells = <0>;
  reg = <0xe0002000 0x1000>;
  view-port = <0x0170>;
  drv-vbus;
 };
};
&usb0 {
 dr_mode = "host";
 usb-phy = <&usb_phy0>;
};
  1. 因为我们最终使用的应用层操作系统是linaro系统,所以不需要使用petalinux生成的rootfs文件,因此不需要对rootfs作额外配置,因此直接使用petalinux-build
    进行构建

  2. 工程生成完成后,使用petalinux-package --boot --format BIN –fsbl ./images/linux/zynq_fsbl.elf --fpga ./images/linux/test_wrapper.bit --u-boot
    生成BOOT.BIN
    文件,准备一个带FAT分区和EXT4分区的存储卡,将BOOT.BIN和image.ub放入FAT分区,EXT4分区则使用linaro系统镜像进行部署,而不使用petalinux生成的rootfs包

  3. 存储卡部署完毕后应可以正常启动linaro操作系统,为其连上网线,做好软件包更新后即可开始安装opencv。Opencv在安装时默认安装配置不能够识别到python3,因此为了保证安装完整性,在opencv的cmake阶段加入如下参数配置:

-D BUILD_opencv_python3=ON\  
-D PYTHON3_EXECUTABLE=$(which python3)\  
-D PYTHON_INCLUDE_DIR=/usr/include/python3.5m\  
-D PYTHON_INCLUDE_DIR2=/usr/include/arm-linux-gnueabihf/python3.5m\  
-D PYTHON3_NUMPY_PATH=/usr/lib/python3/dist-packages\  
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/local/lib/python3.5/dist-packages/numpy/core/include\  
-D PYTHON_LIBRARY=/usr/lib/arm-linux-gnueabihf/libpython3.5m.so\  
-D PYTHON_LIBRARY=/usr/lib/arm-linux-gnueabihf/libpython3.5m.so\  

  1. 任务所用的网络摄像头是使用RTSP视频流协议来传播的,Opencv可以很方便调用RTSP视频流协议的摄像头。为了利用Opencv打开摄像头,此处用C++调用opencv写了一个简单的例程:
#include <opencv2/opencv.hpp>
#include <iostream>
#include <stdlib.h>
 
using namespace std;
using namespace cv;
char filename[100];
int main()
{
	VideoCapture cap;
 	
	cap.open("rtsp://admin:[email protected]:554/cam/realmonitor?channel=1&subtype=0");
	Mat Camera_CImg;
	Mat Camera_GImg;
	cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
	cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
	if (!cap.isOpened())
		return -1;
	int a=0;	
	while (1)
	{
		sprintf(filename,"pic%d.png",a);
		cap >> Camera_CImg;
		if (Camera_CImg.empty())
			break;
		cvtColor(Camera_CImg, Camera_GImg, CV_RGB2GRAY);
        	imwrite(filename,Camera_GImg);
		if (cvWaitKey(10) == 'q')
			break;
		a++;
	}
	return 0;
}

程序执行的功能为打开网络摄像头并循环读取并将图像转换为灰度图按文件序号保存。 使用g++ test.cpp \`pkg-config --cflags --libs opencv\`来编译文件。

  1. *安装图形界面(非必须)
    为了能直观的看到演示效果,可以安装VNC图形界面,通过局域网远程VNC桌面连接看到程序的执行结果。
    使用sudo apt install xfce4 xfce4-goodies tightvnc命令安装xface图形界面
    tightvnc需要配置才能使用,可自行网络查找配置方法,最终效果如下:

图形界面

运行程序状态如下:  

运行界面

处理参数

测试环境:使用网上的RTSP直播源作为视频源进行程序测试

存储速度约6帧/s

测试环境:使用USB UVC摄像头作为视频源进行程序测试

存储速度约10帧/s

测试环境:使用局域网内的网络摄像头的RTSP视频源进行程序测试

可能遇到的问题的解决的记录

  • Sudo无法运行:检查rootfs部署时是否权限有误

  • 添加USB支持时找不到对应cfg文件:如果没有project-spec/meta-user/recipes-kernel/目录可以尝试在project-spec/meta-plnx-generated/recipes-kernel/目录下查找cfg文件

  • 系统使用lsusb命令无输出:参照第三步的设备树文件的修改方式重新修改

  • 系统使用lsusb命令能识别U盘但不能识别USB摄像头:参照第三步的cfg文件的修改方式重新修改

  • 系统apt-get update upgrade缓慢:更换源,清华有armhf架构的apt源

  • petalinux-build 遇到 cpio: cannot seek on output: Invalid
    argument:在project-spec/meta-plnx-generated/recipes-core/images/petalinux-user-image.bb
    文件末尾加上IMAGE_FSTYPES_remove = “cpio.gz cpio cpio.gz.u-boot cpio.bz2”

  • opencv安装后不能成功调用/使用:

    • opencv4.x在linaro的安装会有问题,建议使用opencv3.x

    • 尽量使用pkg-config包管理opencv

暂未解决的问题

  • Opencv在编译安装时不能成功发现armhf平台安装的gstreamer,这可能对视频源处理的效率会有一定的影响

  • 在最初使用petalinux配成的系统时发现opencv虽然已安装但无法调用无法使用,文件系统里也没有opencv对应的库文件,且很多需要用到的库无法通过apt工具自行下载,这是最终没有使用petalinux所配置的系统的原因

可能的改进方向

  • 如果对视频源输入方式没有要求的话,使用USB连接的摄像头可能会拥有更好的效果

  • 当前运行平台是一个有完整功能的系统,在最终应用中会显得过于臃肿,可以考虑在某些方面对其进行精简

  • 如果对视频源输入方式没有要求的话,使用USB连接的摄像头可能会拥有更好的效果

  • 当前运行平台是一个有完整功能的系统,在最终应用中会显得过于臃肿,可以考虑在某些方面对其进行精简

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章