switch底座的hdmi接口不能直接插电脑,有点头秃,然后发现PYNQ有能读HDMI的口,特想有么的可能把switch的图像读出来,慢慢写慢慢写。
文章目录
简单的HDMI读取
首先来看看PYNQ-Z2对HDMI的支持功能吧
在
官方网站
视频子包包含了从HDMI-In端口读取、写入到HDMI-Out端口、传输数据、设置中断和操作视频帧的驱动程序的集合。
视频硬件子系统由一个HDMI-In块、一个HDMI-Out块和一个视频DMA组成。HDMI-In和HDMI-Out块也支持颜色空间转换,例如从YCrCb到RGB和返回,并改变每个像素的通道数量。
视频数据可以从HDMI-In捕获,并使用视频DMA来stream到DRAM,或从DRAM stream到HDMI-Out。
HDMI-IN
HDMI-OUT
对于我目前而言,如何读入HDMI 是需要关心的
例程
看一下例程吧
from pynq import Overlay
from pynq.lib.video import *
base = Overlay('base.bit')
### 初始化一个hdmi的实例
hdmi_in = base.video.hdmi_in
### hdmi_out = base.video.hdmi_out
# 进行配置,默认是24bit的BGR
hdmi_in.configure()
# 执行
hdmi_in.start()
# 读取输入的视频流
frame = hdmi_in.readframe()
把它放进jupyter notebook看一眼吧
emmm看来必须插着设备才能进行配置(好像就应该是这样喂!!!)
我把手机接了一根HDMI线输出了出来(SWITCH那个大盒子太麻烦了,等弄好了再试SWITCH)
ok!
现在我们来读一下输入的视频流
并用PIL来显示它出来看看
from PIL import Image
Image.fromarray((frame))
emmm好像有点问题哈,我手机的颜色明明是
看了一下粉色的RGB是ffd6da,也就是[255,214,218]
那个香草色的则是dad6ff,也就是
[218,214,255]
联想一下刚才说的输出是
24bit的BGR
果然是蓝色和红色通道弄反了么?
从维度的len我们可以看出来,frame的第一个维度是height,第二个维度是width,第三个维度则是RGB顺序,如此这般我们只需要让他的第三个维度逆序一下就可以了嘛
我们可以看到例程里面给了bgr2rgb的示例
colorspace_in = base.video.hdmi_in.color_convert
colorspace_out = base.video.hdmi_out.color_convert
bgr2rgb = [0, 0, 1,
0, 1, 0,
1, 0, 0,
0, 0, 0]
colorspace_in.colorspace = bgr2rgb
colorspace_out.colorspace = bgr2rgb
colorspace_in.colorspace
ok可以了
hdmi 相关函数的分析
还是
官方网站
前面实例化之后,第一步是配置configure
hdmi_in.configure()
而且我们发现输出的图像是720p的,有没有可能从这里考虑一下嘞?
好像不太一样,又找了找发现应该是Mode这个参数。
为了配合switch,我们给它改成1920×1080和30fps
hdmi_in.mode.width = 1920
hdmi_in.mode.height = 1080
hdmi_in.mode.fps = 30
未完待续预告
传递视频的思路是在pynq上运行一个服务器端,然后PC上运行一个客户端,从服务器端获取图像。
下一篇应该是如何搭建服务端了
广告时间
FPGA入门
FPGA实战训练精粹
Xilinx FPGA权威设计指南:基于Vivado 2018集成开发环境
Xilinx Zynq7020
FPGA设计技巧与案例开发详解(第2版)