利用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連接的攝像頭可能會擁有更好的效果

  • 當前運行平臺是一個有完整功能的系統,在最終應用中會顯得過於臃腫,可以考慮在某些方面對其進行精簡

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