PYNQ-Z2(六)理解pynq是如何用的

【PYNQ-Z2试用体验】玩转PYNQ系列:三、PYNQ数字图像处理之图像采集

在硬件上,PYNQ-Z2为更好地扩展图像应用,同时配备了HDMI输入和HDMI输出端口。但硬件上并没有使用HDMI芯片进行控制,而是直接将HDMI接口连接到PL引脚。这意味着HDMI接口需要由可编程逻辑中的HDMI IP控制。
PYNQ-Z2(六)理解pynq是如何用的_第1张图片
在官方的PYNQ框架中,HDMI IP连接到PS DRAM,视频数据流可以从HDMI传输到内存,也可以从内存流式传输到HDMI输出。可以使用Python对视频数据进行采集与操作,或者使用Python将生成的图像或视频流写入HDMI输出。
PYNQ-Z2(六)理解pynq是如何用的_第2张图片
输入部分:
PYNQ-Z2(六)理解pynq是如何用的_第3张图片
输出部分:
PYNQ-Z2(六)理解pynq是如何用的_第4张图片
总的来说,可以通过两种方式对视频数据进行操作:
第一种:在PS中,使用Python操作HDMI图像数据;
第二种:在PL中,修改原框架布局,在HDMI数据流中插入自定义视频处理IP。

由于在实现难度上第一种方式相对简单,我们由浅入深,先学习使用Python调用PYNQ的HDMI图像接口的操作。PYNQ官方系统中,为图像处理已经安装好了图像处理利器OpenCV与相关的Numpy等科学计算包。

PYNQ-Z2(六)理解pynq是如何用的_第5张图片
要使用Python对HDMI图像接口进行操作,Python需要首先调用烧写程序,对芯片的PL烧写包含PYNQ硬件框架的二进制流文件,以确保在硬件上存在相应的逻辑电路。
同样地,在进行其他如LED、音频端口等硬件时,也要进行同样的操作。

 

  1. from pynq import Overlay
    base = Overlay ( 'base.bit' )

    接下来就可以使用PYNQ提供的库来控制HDMI接口:
     
  1. from pynq.lib.video import *
    # 实例化HDMI接口对象
    hdmi_in = base . video . hdmi_in
    hdmi_out = base . video . hdmi_out

     

接下来通过一个完整的HDMI图像处理程序,对整个流程进行演示。
 

  1. 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

     


在实验前按如图对设备接线
PYNQ-Z2(六)理解pynq是如何用的_第6张图片
在实验中我们使用的是USB摄像头,如图所示:
PYNQ-Z2(六)理解pynq是如何用的_第7张图片
插入摄像头后,使用ls命令查看摄像头是否成功安装

接下来运行程序。

需要注意的是,PYNQ的库支持的是系统中的Python3.6,如果直接使用命令Python执行,会默认用系统中的Python2执行,产生库不存在的错误。
PYNQ-Z2(六)理解pynq是如何用的_第8张图片


程序执行结果如图。
由于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=

http://bbs.elecfans.com/user/1954041/posts/

你可能感兴趣的:(FPGA学习)