2020-07-11 PYNQ > HDMI出力で線を引く (pynq.lib.video Moduleのwriteframe()使用 + frameのRGB値を変更)


動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)

概要

  • bitstreamはbase.bitを使う
  • pynq.lib.video ModuleにあるAPIでHDMI入力とHDMI出力を行う
  • readframe(), writeframe()を使う
  • writeframe()の前にframeの値を変更することで、線を引く

接続

PCのHDMI出力をPYNQに読み取らせる。

  • A. PCのHDMI端子 <-> PYNQのHDMI IN
  • B. PYNQのHDMI OUT <-> モニタのHDMI

手順

上記で実行したbase/videoのvideoサンプルを使う。

実際には下記を実行する。

準備

from pynq.overlays.base import BaseOverlay
from pynq.lib.video import *

base = BaseOverlay("base.bit")
hdmi_in = base.video.hdmi_in
hdmi_out = base.video.hdmi_out
hdmi_in.configure()
hdmi_out.configure(hdmi_in.mode)

hdmi_in.start()
hdmi_out.start()

ここまででHDMI入力とHDMI出力の準備ができる。

線を引く

frameの一部のRGB値を0にすることで黒の線を引く。

aframe = hdmi_in.readframe()
print(aframe.shape)

for idx in range(100):
    aframe[idx][100][0] = 0
    aframe[idx][100][1] = 0
    aframe[idx][100][2] = 0

hdmi_out.writeframe(aframe)
(720, 1280, 3)

27インチ縦置きのモニタで線を引くことができた。

frame

今回試した設定ではframeのサイズは(720, 1280, 3)。単純なRGB値のnumpy ndarrayのようだ。
これであれば、HDMI OUTで任意の図形描画(と文字)ができる気がする。

座標は、右上が(0,0)になるようだ。

frame[column][row][RGB]

RGBは下記のようになるようだ。
0: blue
1: green
2: red

HDMI INなし

HDMI INをつなげずに出力だけの場合は下記のようにする。
黒い背景に赤色の線が見える。

frame2 = hdmi_out.newframe()
for idx in range(700):
    frame2[idx][100][0] = 0  # blue
    frame2[idx][100][1] = 0 # green
    frame2[idx][100][2] = 255

hdmi_out.writeframe(frame2)

遅い

frame2(numpy ndarray)への代入は遅い。
70 * 700 の代入で13秒程度かかる。
np.zeros()などを使った場合、flush()がない、などのエラーとなる。
単純なnumpy ndarrayでもないのかもしれない。