概要ビットマップ画像ファイルをヘッダファイルとして出力するVBAマクロを作成。作成したVBAマクロでは、ビットマップ画像ファイルからバイナリデータを取得し、以下の情報をそれぞれをヘッダファイルに書き出している。HDMI出力デモに実装し、ヘッダファイル化したサンプル画像がHDMI出力できることも確認。Zynqを用いたシステムを構築し、HDMI出力アプリケーションや画像処理IPの作成に挑戦しています。VBA上で作成しました。前回の記事で、静止画をHDMI出力するZynqのアプリケーションを作成しました。アプリケーションでは、メモリ内のフレームバッファから各画素値を読み出して、HDMI形式でディスプレイへ出力しています。フレームバッファには予め赤色一色となるように画素値を入れておきました。【HDMI出力編(3)】静止画をZynqからHDMI出力するVitisアプリケーション本記事では、Vitisを用いてZybo経由で外部ディスプレイに画像を出力するアプリケーションを作成します。アプリケーションでは、ドライバ関数によりIPコアの設定を行った後、読み出すフレームバッファに直接静止画を書き込んでいます。phys-higashi.com2021.03.28ひがしただ、赤色一色だけだと画像処理を行っても、結果がよくわかりません...。そこで、静止画をヘッダファイル化し、フレームバッファに格納しておいて、それを読み出すようにしたいなと考えました。VBAを使用しています。フレームバッファに予め所望の静止画を格納する方法は他にもあるかもしれませんが、今回はこのヘッダファイルを作成する方法をとっています。最後に、余談としてHDMI出力の様子も紹介しますので、ぜひご覧いただければと思います。Basicのコード例を書いておきます。Editorに貼り付けて、Main関数を実行すると、ファイル選択ダイアログが立ち上がります。ファイル選択ダイアログで所定のビットマップファイルを指定すれば、Excelシートを格納しているパス上にheader.hという名前のヘッダファイルが作成されます。"bmp画像を選択してください。ユーザ定義型は定義されていません」というエラーがFileSystemObjectで発生した場合は、以下のようにすれば回避できると思います。Runtime]にチェックをつけ、「OK」をクリックコードの説明ビットマップ画像の構成ビットマップ・ファイルの内部のバイナリ構成は図のようになっています。前半14byteがファイル・ヘッダ、次の40byteが情報ヘッダと呼ばれ、残りの領域には画像データが格納されています。RGBTRIPLE本記事で作成したVBAマクロでは、ファイル・ヘッダから画像の幅と高さに関する情報、画像データから画素値に関する情報を読み出して、ヘッダファイルに書き出しています。ファイル入出力関数ビットマップ画像の読み込みMain関数の中の以下のコードでは、まず指定したパスのビットマップ画像をバイナリデータで取得しています。bDataという配列内にバイトごとにデータを格納しました。#iFileBMPのバイナリ配列から情報ヘッダ(biHeader)と画像データ(rgbData())をまとめた構造体を作成bDataという配列から所望の画像の幅と高さに関する情報と画像データを取得します。iまず、biHeaderという構造体を定義します。この構造体には情報ヘッダ内の各バイナリデータを格納します。画像の幅に関する情報は、ビットマップ画像ファイルにおいて、オフセット18~21(4byte)の領域にリトルエンディアン形式で保存されています。\)を配列bDataの18~21番目の要素を用いて計算して取得しました。複数のバイトで構成されるデータを記録・伝送する際の並び順の一つで、最下位のバイトから上位に向けて順に取り扱う方式。例に示したように、18byte目が最下位のバイトで、1byte進むごとに8bit分上位にシフトしているような方式です。次に、画像データに関しては、RGBTRIPLEというRGB1画素分を一まとまりにした構造体の配列rgbData(i)に保存していきます。ビットマップ画像ファイルの54byte目からBGRの順に各画素値が格納されていますので、配列bDataから画素値を順次読み出して、配列rgbData(i)に格納しました。ヘッダファイルの作成テキスト形式のファイルの作成は、FileSystemObjectというVBAのオブジェクトのCreateTextFileというメソッドを使用しました。作成したテキストファイルはTextStreamというオブジェクトでインスタンス化され、writelineというメソッドで1行ずつテキストを書き込むことができます。Str(biHeader.biHeight))RGB画像データを順番に1行ずつ、以下の形式でテキストファイルに保存していきます。\mathrm{R(511)}\}\}$$※サンプル画像のビットマップファイルデータの画像幅.biWidthが512でしたので、上式では512画素分を1行分としていますなお、bmp形式では、左から右へ、そして下から上へという順で画素値が指定されています。ディスプレイでは下から上ではなく、上から下へという順で画素値が指定されます。作成したヘッダファイルVBAマクロを動作させて、次のサンプル画像(画素数640×480)をヘッダファイル化してみました。ひがし筆者が近くの公園で撮影した画像を使用しています。我ながらベストショットだと思っています。得られたヘッダファイルは、以下のような形式で出力されます。HDMI出力デモに実装してみた前回の記事で作成したHDMI出力のアプリケーション・プロジェクトに、作成したヘッダファイルを組み込んでみましょう。【HDMI出力編(3)】静止画をZynqからHDMI出力するVitisアプリケーション本記事では、Vitisを用いてZybo経由で外部ディスプレイに画像を出力するアプリケーションを作成します。アプリケーションでは、ドライバ関数によりIPコアの設定を行った後、読み出すフレームバッファに直接静止画を書き込んでいます。phys-higashi.com2021.03.28ソースコードを以下のように変更して、HDMI形式でフレームバッファ内部の画像を出力してみました。配列frameBufにヘッダファイルで定義した配列bmptoheaderの値を代入しています。メモリ容量が足りない場合は、配列bmptoheaderを直接読み出してもよいかと思いますが、今回はわかりやすさを優先し代入してみました。0;}HDMI出力結果ひがし無事に写真の通り、ディスプレイに想定通りのサンプル画像を出力することができました!ひがし少しずつですが、画像処理っぽい記事に近づいてきました。X260のハードディスクとメモリの交換を行いました。SDSSDH3-1T00-J25を採用し、256GBから1TBに容量アップしています。IPが提供されています。IPを使用する際に前提となるCORDICアルゴリズムについて抑えておくべきポイントを本記事にまとめました。本記事では、Zynqが外部からのHDMI信号を受信しDDRメモリに格納した後、DDRメモリを読み出しVGA信号を送信するDigilent社のデモサンプルの解説を行い、デモサンプルをもとにZynq内部のハードウェア構成を作成しています。Csim】Vitisビジョンライブラリでテストベンチ関数を使ったCシミュレーションの方法を解説。用例のcustomconvに含まれるFilter2D_accelを例にラプラシアンフィルタの高位合成と実装をめざす(本記事はCシミュレーションのみを行う)ビジョンライブラリビジョンライブラリの画像処理結果をディスプレイ表示【(1)構成】Vitisビジョンライブラリのcustomconvに含まれるFilter2D_accelを例にラプラシアンフィルタを行うIPを高位合成。本記事ではラプラシアンフィルタリング処理した画像をディスプレイ表示するブロックデザインの構築方法を紹介。World”をシリアル出力するFPGAロジックの作成IPパッケージャーを使用してMaster側のAXI4-Liteインタフェースを追加する方法を解説しました。Lite”に文字列をAXI経由で入力し、シリアル出力するロジックを作成し、Zybo上で動作確認を行いました。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。-掛け算IPをZyboに実装-2021.04.182022.02.13Rustupをインストールするときに発生したエラーの回避方法2021.08.102021.11.07。