Vitisとopencvを連携させて画像処理を行う


## 経緯

沖縄高専には2022年度時点で、4年に組込みシステムの授業があります。
そこで僕も含めてみんなかなり苦しめられていたので、その最終課題「Vitisをopencvを連携させて画像処理を行う」について記事を書こうと思います。誰かの助けになれば幸いです

## 環境
・PC：Windows10、64bit
・HDD(2TByte)にVitis2021.1(Windows版)を入れてPCにつないで動かしている
・インストールにかかった時間：半日

## 結論

まず結論を言いますと、次のひがし研究所さんのページを見ながら、「まったく同じように」進めてください。（１）が終わったら（２）を進めてください。

https://phys-higashi.com/2501/

...このページのリンクを貼った時点でもう自分の役割は終了しているわけなんですが、このページを見ながら自分がぶつかったエラーや引っかかった箇所について記述していこうと思います。

先ほども言いましたが、重要なのは「まったく同じように」やることです。ダウンロードしているソフトウェアのバージョンから、ファイルを置く階層まで、すべて上のページに倣ってやってください。環境がすべて同じなのにうまくいかなかったら、あなたは悪くないです。「できませんでしたこの野郎」というレポートを書いて出して寝ましょう。


## 手順

まず、大まかな手順を次に示します。

#### １．mingwとcmakeをインストールする
#### ２．opencvをダウンロードしてビルドする
#### ３．ビジョンライブラリをダウンロードして展開する
#### ４．Vitisでいろいろ設定する
#### ５．プログラムを実行する
####

それでは、手順ごとに解説していきます。


## １．mingwとcmakeをインストールする

### mingwのインストール

おとなしくこのページに従っていると、んん？最初の壁にぶち当たります。ページでは下のような画像が乗せられていますが、

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/771cfcb6-ce46-dc6d-bccd-4039fd08cfaf.png)

実際にはこう

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/9ff2c3a7-226a-a50c-1758-08dc5fe09344.png)

僕はGithub何もわからないので、T.Johzakiさんの以下のリンクを参考に別の方法でmingwをインストールしていきます。

https://home.hiroshima-u.ac.jp/tjohzaki/rgdl_html/programming/gfortran_install2.htm

「まったく同じように」やるとか言っておきながら、いきなりやり方が違うじゃないか！と思うかもしれませんが、僕が「まったく同じように」しないといけないといったのは、インストールするソフトのバージョンや、ファイルを置く階層なので、逆に言うとやり方は何でもいいんです。もちろん、できるだけやり方も同じがいいですが。

では、Github使わずにmingwをダウンロードしていきたいと思います。ひがし研究所さんはインストーラを使ってインストールを行っていましたが、ここではmingwのプログラムをダウンロード→展開→適切な場所に配置していきます。インストーラが自動でやってくれいている作業を手動でやるイメージですね。
まずこのリンクに飛びます。

https://sourceforge.net/projects/mingw-w64/files/?source=navbar

下の画面でFilesのタブを押し、下にスクロールします。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/2d34e72e-5f30-76e0-a66a-6107960e08da.png)

ここで「x86_64-posix-seh」を押します。[T.Johzakiさん](https://home.hiroshima-u.ac.jp/tjohzaki/rgdl_html/programming/gfortran_install2.htm)は「x86_64-posix-sjlj」を選択していますが、ひがし研究所さんは「x86_64-posix-seh」をインストールしているので、ここではひがし研究所さんに従います。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/fb27eb8b-c878-a0c1-ca40-511198e41215.png)

以降の手順は、[T.Johzakiさん](https://home.hiroshima-u.ac.jp/tjohzaki/rgdl_html/programming/gfortran_install2.htm)に従ってください。

これで、mingwのインストールは完了です。ひがし研究所さんのページに戻って、mingwのインストーラを実行してシステム環境変数を設定するあたりからまたやります。
一つ注意してほしいのは、環境変数を設定するときに、「￥」キーではなく「\」キーで入力してください。どちらも「￥」として表示されますが、「￥」キーで入力するとたしかエラーが出たような古の記憶があります。

### CMakeのインストール

ひがし研究所さんは「最新の64bit版のインストーラWindows x64 Installerを選択します。」といっていますが、それだとエラーが出ますので、ここはひがし研究所さんと同じ3.22.1バージョンをインストールします。

このリンクにとびます。

https://cmake.org/

画像の「Download Latest Release」を押します。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/15d2a8aa-70f3-8635-9aac-a43152d4df70.png)

スクロールするとすぐに最新のCMakeが姿を現しますが、さらに下にスクロールして、「Older Releases」と書いてあるところまでスクロールします。僕はgithub苦手なので、上の方を選択します。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/c4cbed78-634a-843b-cf83-a32f2c216405.png)

下にスクロールして「v3.22/」を押します。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/a90e774a-e681-31f0-514f-c25e2b87931c.png)

下にスクロールして「cmake-3.22.1-windows-x86_64.msi」を押します。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/59abddaf-e038-e7d7-c687-ab45223bd863.png)

ファイルがダウンロードされるまで待ちます。そのあとは、ひがし研究所さんの「CMakeのインストール」からまた手順に従っていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/d02c1081-4bcb-4f3c-e473-17c58d4584f9.png)
↑ここから再開

# ２．opencvをダウンロードしてビルドする

ひがし研究所さんの指示に従って進めてください。
opencvは最新版ではなく、ひがし研究所さんと同じように4.4.0のWindows版をダウンロードしましょう。何も考える必要はありません。同じ環境で同じことをすればうまくいきます。そうじゃないとやってられません。

インストール先のフォルダが「C:\opencv_hls」となっていますが、そのようなフォルダはないため、作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/31684487-88cb-5f4d-4934-5f3314b35929.png)

そしてひたすらひがし研究所さんの指示に従います。ここでも環境変数の設定が出てきますので、「￥」を「\」キーで打ち直しましょう（見た目はどっちのキーで打っても「￥」になります）。

# ３．ビジョンライブラリをダウンロードして展開する

ひがし研究所さんの（１）のページが終わったので、（２）のページに移りましょう。

https://phys-higashi.com/2648/

そしてひがし研究所さんの指示に従いましょう。

ひがし研究所さんの説明だとGithubから「Vitis_Libraries-master.zip」というファイルがダウンロードされますが、実際には「Vitis_Libraries-main.zip」というファイルがダウンロードされます。名前が違うので不安ですが、結局これで最後まで行けたので、ファイルをいじって想定外の不具合を起こしたりしないよう、ここはそのまま進めます。

「C:/Xilinx」というフォルダがなければ作り、そこに解凍した「Vitis_Libraries-main」をコピーまたは貼り付けしましょう。

# ４．Vitisでいろいろ設定する

まず、ひがし研究所さんのページの「Vitis HLSの設定」のところで他のリンクに飛ぶ必要があります。

リンクに飛び、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/0b70e0f0-b538-588f-04cd-25df7df2dcb1.png)

下にスクロールし、目次の中の「プロジェクトの前準備」を押して、そこを参考にしながらプロジェクトを作りましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/75cbc40c-24e4-1ee5-748d-36bddad2dca9.png)

ここで、最後にFPGAチップを選択する手順が出てきたと思いますが、僕はそのまま「Finish」を押しました。理由は、自分たちの今回の授業ではシミュレーションまでで十分だったので、ボードは何でもいいからです。
FPGAにプログラムを実装したい人は、自分が使いたいボードに合わせて選択してください。今回はとりあえず、シミュレーションまでを想定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/6ba798ed-2b7e-4e92-2d71-f5149d1d99a5.png)

そしてFinishを押したらさっきまでいたページに戻りましょう。

https://phys-higashi.com/2648/

そして、ひがし研究所さんの指示に従います。

Project Settings を行うところで、
・(A) Simulationの設定(Cシミュレーションのための設定)
とか
・(B) Synthesisの設定(高位合成のための設定)
といっているのは、

左側のやつの話です。自分は最初戸惑いましたので、画像を乗せておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/6b47c33a-8f3e-3ef8-6548-9f6bab0f6df3.png)

そして、(A)の①の手順のところで、赤い線で囲ったところのPATHが違っていて戸惑った人もいるかもしれませんが、間違いは誰にでもあります。そしてひがし研究所さんにもあります。ここは自分を信じて、自分の階層の通りに入力しましょう。
ここまでファイルをどこの階層に置くかも含めてすべてひがし研究所さんの指示に従ってきた人であれば、ここの OPENCV_BUILD_PATH は「C:\opencv_hls\opencv\build_mingw」になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/55df2d03-65f3-4ed3-9efb-f06600fff7a0.png)

# ５．プログラムを実行する

そのままひがし研究所さんに従うと、最後の「Cシミュレーションでの実行処理の確認」のところまで行けると思います。いよいよ実行です。うまくいくか緊張しますね。どきどき。

「C Simulation」は意外と時間かかりますので、焦らず待ちましょう。画面の右下をみると何やら進んでるのが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/4b1e184b-7b18-5c65-13ba-218cd55f3d31.png)

そして、「C Simulation」でエラーが出なければ左上に実行マークが出てきますので、実行します。エクスプローラーでプロジェクトの中の「/solution1/csim/build」の階層へ行き、3つの画像を確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/a63149e5-4802-c7d7-f979-cffc05704183.png)

ひがし研究所さんのようになっていれば、成功です！お疲れ様でした。

余力があれば、他のライブラリを試してみたり、自分でプログラムを作ってライブラリ同士を繋げればより高度な処理ができるかもしれないですね。

一応、この記事は僕のレポートも兼ねているので、自分の成果として成功した証拠を乗せておきます。

・成功時プロジェクト画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/db180157-bf03-7a46-b0b9-71a73a995fee.png)
・output_ocv.png
![output_ocv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/599d63c8-22f6-264d-a59b-81c6439034b1.png)
・hls_out.jpg
![hls_out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/e57eb901-615a-cfa8-a3da-d439279bd092.jpeg)
・error.png
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599963/43acdb81-c1f5-f8f1-51b4-35c471d34790.png)

# エラーレポート

トラブルシューティングというほど充実してはいませんが、僕と僕の周りの人が直面したエラーとその解決法を紹介しておきます。Vitisというものは最後までよくわからなかったので、僕はエラーが出てちょっと頑張ってわからなかったら、手順を戻ってやり直していました。かなり力業ですが、意外とこれが一番早かったりします。

### code 0xc0000139 と書いたエラーメッセージ
・いつ出たか→VitisでC Simulationを実行時
・どのように解決したか→CMake、mingw、opencvのバージョンがすべてちょっとずつ違っていたため、バージョンをすべて合わせて一からやり直した。一気に直したのでどれが原因だったのかはわからない

### recipe for target 'all' failedというエラーメッセージ
・いつ出たか→cmdからmingw32-make buildというコマンドを実行したとき
・どのように解決したか→すでにビルドが完了していた人からビルド後のファイルをもらった