【PYNQ-Z2试用体验】玩转PYNQ系列:三、PYNQ数字图像处理之图像采集
在硬件上,PYNQ-Z2为更好地扩展图像应用,同时配备了HDMI输入和HDMI输出端口。但硬件上并没有使用HDMI芯片进行控制,而是直接将HDMI接口连接到PL引脚。这意味着HDMI接口需要由可编程逻辑中的HDMI IP控制。
在官方的PYNQ框架中,HDMI IP连接到PS DRAM,视频数据流可以从HDMI传输到内存,也可以从内存流式传输到HDMI输出。可以使用Python对视频数据进行采集与操作,或者使用Python将生成的图像或视频流写入HDMI输出。
输入部分:
输出部分:
总的来说,可以通过两种方式对视频数据进行操作:
第一种:在PS中,使用Python操作HDMI图像数据;
第二种:在PL中,修改原框架布局,在HDMI数据流中插入自定义视频处理IP。
由于在实现难度上第一种方式相对简单,我们由浅入深,先学习使用Python调用PYNQ的HDMI图像接口的操作。PYNQ官方系统中,为图像处理已经安装好了图像处理利器OpenCV与相关的Numpy等科学计算包。
要使用Python对HDMI图像接口进行操作,Python需要首先调用烧写程序,对芯片的PL烧写包含PYNQ硬件框架的二进制流文件,以确保在硬件上存在相应的逻辑电路。
同样地,在进行其他如LED、音频端口等硬件时,也要进行同样的操作。
-
from pynq import Overlay base = Overlay ( 'base.bit' )
接下来就可以使用PYNQ提供的库来控制HDMI接口:
-
from pynq.lib.video import * # 实例化HDMI接口对象 hdmi_in = base . video . hdmi_in hdmi_out = base . video . hdmi_out
接下来通过一个完整的HDMI图像处理程序,对整个流程进行演示。
-
from pynq.overlays.base import BaseOverlay from pynq.lib.video import * base = BaseOverlay("base.bit") # monitor configuration: 640*480 @ 60Hz Mode = VideoMode(640,480,24) hdmi_out = base.video.hdmi_out hdmi_out.configure(Mode,PIXEL_BGR) hdmi_out.start() print("HDMI Initialized") # monitor (output) frame buffer size frame_out_w = 1600 frame_out_h = 900 # camera (input) configuration frame_in_w = 640 frame_in_h = 480 # initialize camera from OpenCV import cv2 videoIn = cv2.VideoCapture(-1) videoIn.set(cv2.CAP_PROP_FRAME_WIDTH, frame_in_w); videoIn.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_in_h); print("Capture device is open: " + str(videoIn.isOpened())) # Capture webcam image while True: ret, frame_vga = videoIn.read() # Display webcam image via HDMI Out if (ret): outframe = hdmi_out.newframe() outframe[0:480,0:640,:] = frame_vga[0:480,0:640,:] hdmi_out.writeframe(outframe) else: raise RuntimeError("Failed to read from camera.") break if cv2.waitKey(50) & 0xff == ord('q'): break videoIn.release() hdmi_out.stop() del hdmi_out
在实验前按如图对设备接线
在实验中我们使用的是USB摄像头,如图所示:
插入摄像头后,使用ls命令查看摄像头是否成功安装
接下来运行程序。
需要注意的是,PYNQ的库支持的是系统中的Python3.6,如果直接使用命令Python执行,会默认用系统中的Python2执行,产生库不存在的错误。
程序执行结果如图。
由于OpenCV程序基本上是在PS部分运行的,只是在视频输入输出的时候使用到PL部分的HDMI 接口。所以从本质上来讲,第一种开发方式和在一个双核A9嵌入式板卡上执行没有两样,只是PYNQ-Z2提供了直接进行HDMI视频流输入输出的软硬件接口,使得进行图像的采集与输出更加方便。
PYNQ提供的Python API使得快速原型开发与验证得以实现,但是为了更好地发挥PYNQ作为FPGA开发板的性能优势,更推荐的方式是第二种开发方式,通过充分利用PL部分对图像算法进行加速,可使程序的执行效率得到几倍甚至数十倍的提高。
值得参考的是,已经有一些开源工程对第二种方式进行了实践,比如在Xilinx大学计划的GitHub中,就提供了在PYNQ基础上对OpenCV加速的Python库:cv2pynq。
通过修改PYNQ框架,定制Overlay进行进一步算法加速的技术,有机会会在本系列的高阶部分分享给大家,敬请期待!
网友们如果有对PYNQ-Z2的某个应用方向有疑问,欢迎留言讨论!
转自:http://bbs.elecfans.com/forum.php?mod=viewthread&tid=1723275&page=1&extra=