SDSoC での使用方法

この章では、xfOpenCV ライブラリ関数を使用してデザインを作成するために必要な情報を示します。

使用要件

このセクションでは、ZCU104 ベースのプラットフォームで xfOpenCV ライブラリ関数を使用するための要件を示します。ZC702 および ZC706 reVISION プラットフォームにも同じ要件が適用されます。
  • SDSoC 開発環境 リリース ノート、インストール、およびライセンス ガイド の手順に従って SDx 開発環境をダウンロードおよびインストールします。プロジェクトのビルドにターミナルを使用する場合は、SDx 開発環境を起動する前に、$SYSROOT 環境変数を reVISION プラットフォームで提供される Linux ルート ファイル システムに設定してください。次に例を示します。
    export SYSROOT = <local folder>/zcu104_rv_ss/sw/a53_linux/a53_linux/sysroot/aarch64-xilinx-xilinx
  • Zynq® UltraScale+™ MPSoC エンベデッド ビジョン プラットフォーム ZIP ファイルをダウンロードして解凍します。解凍したデザイン ファイル階層の zcu104_rv_ss フォルダーに SDx 開発環境ワークスペースを作成します。詳細は、「reVISION 入門ガイド」を参照してください。
  • ZCU104 評価ボードを設定します。詳細は、「reVISION 入門ガイド」を参照してください。
  • xfOpenCV ライブラリをダウンロードします。このライブラリは GitHub から入手できます。次の git clone コマンドを実行し、xfOpenCV リポジトリをローカル ディスクにクローンします。
    git clone https://github.com/Xilinx/xfopencv.git

HLS ビデオ ライブラリの xfOpenCV への移行

HLS ビデオ ライブラリは、廃止予定です。HLS ビデオ ライブラリで使用可能なすべての関数とほとんどのインフラストラクチャは、xfOpenCV で提供されますが、名前および機能の一部が変更されています。xfOpenCV に移植されたこれらの HLS ビデオ ライブラリ関数では、SDSoc ビルド フローもサポートされます。

このセクションでは、HLS ビデオ ライブラリに含まれる C++ ビデオ処理関数およびインフラストラクチャを使用している場合の詳細を示します。

インフラストラクチャ関数およびクラス

HLS ビデオ ライブラリからインポートされたすべての関数では、xfOpenCV ライブラリと同様、画像データを表すのに hls::Mat ではなく xf::Mat が使用されます。これらの主な違いは、hls::Mat ではデータの格納に hls::stream が使用されるのに対し、xf::Mat ではポインターが使用されることです。そのため、移行の際に hls:: Mat を厳密に xf::Mat に置き換えることはできません。

次の表に、hls::Mat と xf::Mat のメンバー関数の違いを示します。

表 1. インフラストラクチャ関数およびクラス
メンバー関数 hls::Mat (HLS ビデオ ライブラリ) xf::Mat (xfOpenCV ライブラリ)
channels() チャネル数を返す チャネル数を返す
type() ピクセルのデータ型の列挙値を返す ピクセルのデータ型の列挙値を返す
depth() ピクセルのデータ型の列挙値を返す チャネルを含むピクセルの深さを返す
read() ストリームから値を読み出し、スカラー値として返す 指定の場所から値を読み出し、複数ピクセル/クロックのパケット値として返します。
operator >> read() と同様 xfOpenCV にはなし
operator << write() と同様 xfOpenCV にはなし
Write() スカラー値のをストリームに書き込み 複数ピクセル/クロックのパケット値を指定の場所に書き込みます。

HLS ビデオ ライブラリに含まれるインフラストラクチャ ファイル hls_video_core.h、hls_video_mem.h、hls_video_types.h は、xfOpenCV ライブラリの xf_video_core.h、xf_video_mem.h、xf_video_types.h に移行されており、hls_video_imgbase.h は廃止されています。これらのファイルに含まれるコードは、xf::namespace にあることを除き、変更されていません。

クラス

メモリ ウィンドウ バッファー
hls::window は xf::window に移行されています。名前空間以外は、インプリメンテーションは変更されていません。これは、xf_video_mem.h ファイルに含まれます。
メモリ ライン バッファー
hls::LineBuffer は xf::LineBuffer に移行されています。xf::LineBuffer にストレージ構造に異なるタイプの RAM 構造を推論するテンプレート引数が追加されている以外は、これら 2 つに違いはありません。デフォルトのストレージ タイプは RAM_S2P_BRAM で、RESHAPE_FACTOR=1 に設定されています。詳細は、xf::LineBuffer を参照してください。これは、xf_video_mem.h ファイルに含まれます。

関数

OpenCV インターフェイス関数
これらの関数は、画像データを OpenCV Mat フォーマットと HLS AXI タイプの間で変換します。HLS ビデオ ライブラリには 14 個のインターフェイス関数が含まれており、そのうち 2 つ (cvMat2AXIvideo および AXIvideo2cvMat) が xfOpenCV ライブラリの xf_axi.h に含まれます。それ以外の関数はすべて廃止されています。
AXI4-Stream I/O 関数
hls::Mat と AXI4-Stream 準拠のデータ型 (hls::stream) の間の変換を実行する I/O 関数は、hls::AXIvideo2Mat および hls::Mat2AXIvideo です。これらの関数は廃止されており、xf::Mat との変換用に 2 つの新しい関数 xf::AXIvideo2xfMat および xf:: xfMat2AXIvideo が追加されています。これらの関数を使用するには、ヘッダー ファイル xf_infra.h を含める必要があります。

xf::window

2D ウィンドウ バッファーを表現するテンプレート クラス。ウィンドウ バッファーの行数、列数、およびピクセルのデータ型を指定する 3 つのパラメーターがあります。

クラス定義

template<int ROWS, int COLS, typename T>
class Window {
public:
    Window() 
   /* Window main APIs */
    void shift_pixels_left();
    void shift_pixels_right();
    void shift_pixels_up();
    void shift_pixels_down();
    void insert_pixel(T value, int row, int col);
    void insert_row(T value[COLS], int row);
    void insert_top_row(T value[COLS]);
    void insert_bottom_row(T value[COLS]);
    void insert_col(T value[ROWS], int col);
    void insert_left_col(T value[ROWS]);
    void insert_right_col(T value[ROWS]);
    T& getval(int row, int col);
    T& operator ()(int row, int col);
    T val[ROWS][COLS];
#ifdef __DEBUG__
    void restore_val();
    void window_print();
    T val_t[ROWS][COLS];
#endif
};

パラメーターの説明

次の表に、xf::window クラスのメンバーとその説明を示します。

表 2. windos 関数のパラメーターの説明
パラメーター 説明
Val バッファーの内容を保持する 2-D 配列。

メンバー関数の説明

表 3. メンバー関数の説明
関数 説明
shift_pixels_left() ウィンドウを左にシフトします。ウィンドウ内に格納されているデータはすべて右に移動し、一番左の列 (COLS-1) は空になり、新しいデータを挿入できるようになります。
shift_pixels_right() ウィンドウを右にシフトします。ウィンドウ内に格納されているデータはすべて左側に移動し、一番右の列 (0) は空になり、新しいデータを挿入できるようになります。
shift_pixels_up() ウィンドウを上にシフトします。ウィンドウ内に格納されているデータはすべて下に移動し、一番上の行 (ROWS-1) は空になり、新しいデータを挿入できるようになります。
shift_pixels_down() ウィンドウを下にシフトします。ウィンドウ内に格納されているデータはすべて上に移動し、一番下の行 (0) は空になり、新しいデータを挿入できるようになります。
insert_pixel(T value, int row, int col) 新しい要素値をウィンドウの指定の位置 (row, column) に挿入します。
insert_row(T value[COLS], int row) 値のセットをウィンドウの任意の行に挿入します。
insert_top_row(T value[COLS]) 値のセットをウィンドウの一番上の行 (0) に挿入します。
insert_bottom_row(T value[COLS]) 値のセットをウィンドウの一番下の行 (ROWS-1) に挿入します。
insert_col(T value[ROWS], int col) 値のセットをウィンドウの任意の列に挿入します。
insert_left_col(T value[ROWS]) 値のセットをウィンドウの一番左の列 (0) に挿入します。
insert_right_col(T value[ROWS]) 値のセットをウィンドウの一番右の列 (COLS-1) に挿入します。
T& getval(int row, int col) ウィンドウの指定した位置 (row, column) のデータ値を返します。
T& operator ()(int row, int col) ウィンドウの指定した位置 (row, column) のデータ値を返します。
restore_val() ウィンドウ バッファーの内容を別の配列に復元します。
window_print() ウィンドウ バッファーに含まれるすべてのデータをコンソールに表示します。

テンプレートのパラメーターの説明

表 4. テンプレートのパラメーターの説明
パラメーター 説明
ROWS ウィンドウ バッファーの行数。
COLS ウィンドウ バッファーの列数。
T ウィンドウ バッファーのピクセルのデータ型。
ウィンドウ バッファー宣言のサンプル コード
Window<K_ROWS, K_COLS, unsigned char> kernel;

xf::LineBuffer

2D ライン バッファーを表現するテンプレート クラス。ウィンドウ バッファーの行数、列数、およびピクセルのデータ型を指定する 3 つのパラメーターがあります。

クラス定義

template<int ROWS, int COLS, typename T, XF_ramtype_e MEM_TYPE=RAM_S2P_BRAM, int RESHAPE_FACTOR=1>
 class LineBuffer {
public:
    LineBuffer()
       /* LineBuffer main APIs */
    /* LineBuffer main APIs */
    void shift_pixels_up(int col);
    void shift_pixels_down(int col);
    void insert_bottom_row(T value, int col);
    void insert_top_row(T value, int col);
    void get_col(T value[ROWS], int col);
    T& getval(int row, int col);
    T& operator ()(int row, int col);

    /* Back compatible APIs */
    void shift_up(int col);
    void shift_down(int col);
    void insert_bottom(T value, int col);
    void insert_top(T value, int col);
    T val[ROWS][COLS];
#ifdef __DEBUG__
    void restore_val();
    void linebuffer_print(int col);
    T val_t[ROWS][COLS];
#endif
};   

パラメーターの説明

次の表に、xf::LineBuffer クラスのメンバーとその説明を示します。

表 5. ライン バッファー関数のパラメーターの説明
パラメーター 説明
Val ライン バッファーの内容を保持する 2-D 配列。

メンバー関数の説明

表 6. メンバー関数の説明
関数 説明
shift_pixels_up(int col) ライン バッファーの内容を上にシフトします。新しい値が一番下の行 (ROWS-1) に配置されます。
shift_pixels_down(int col) ライン バッファーの内容を下にシフトします。新しい値が一番上の行 (0) に配置されます。
insert_bottom_row(T value, int col) 新しい値をライン バッファーの一番下の行 (ROWS-1) に挿入します。
insert_top_row(T value, int col) 新しい値をライン バッファーの一番上の行 (0) に挿入します。
get_col(T value[ROWS], int col) ライン バッファーの列の値を取得します。
T& getval(int row, int col) ライン バッファーの指定した位置 (row, column) のデータ値を返します。
T& operator ()(int row, int col); ライン バッファーの指定した位置 (row, column) のデータ値を返します。

テンプレートのパラメーターの説明

表 7. テンプレートのパラメーターの説明
パラメーター 説明
ROWS ライン バッファーの行数。
COLS ライン バッファーの列数。
T ライン バッファーのピクセルのデータ型。
MEM_TYPE ストレージ エレメントのタイプ。有効な値は、RAM_1P_BRAM、RAM_1P_URAM、RAM_2P_BRAM、RAM_2P_URAM、RAM_S2P_BRAM、RAM_S2P_URAM、RAM_T2P_BRAM、RAM_T2P_URAM です。
RESHAPE_FACTOR 配列を分割する量を指定します。
次に、ライン バッファー宣言のサンプル コードを示します。
LineBuffer<3, 1920, XF_8UC3, RAM_S2P_URAM,1>     buff; 

ビデオ処理関数

次の表に、HLS ビデオ ライブラリから xfOpenCV ライブラリに移植されたビデオ処理関数を API の変更点と共に示します。

表 8. ビデオ処理関数
関数 HLS ビデオ ライブラリ API xfOpenCV ライブラリ API
addS
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void AddS(Mat<ROWS, COLS, SRC_T>&src,Scalar<HLS_MAT_CN(SRC_T), _T> scl, Mat<ROWS, COLS, DST_T>& dst)
template<int POLICY_TYPE, int SRC_T, int ROWS, int COLS, int NPC =1>
void addS(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1, unsigned char _scl[XF_CHANNELS(SRC_T,NPC)],xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
AddWeighted
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T, typename P_T>
void AddWeighted(Mat<ROWS, COLS, SRC1_T>& src1,P_T alpha,Mat<ROWS, COLS, SRC2_T>& src2,P_T beta, P_T gamma,Mat<ROWS, COLS, DST_T>& dst)
template< int SRC_T,int DST_T, int ROWS, int COLS, int NPC = 1> 
void addWeighted(xf::Mat<SRC_T, ROWS, COLS, NPC> & src1,float alpha, xf::Mat<SRC_T, ROWS, COLS, NPC> & src2,float beta, float gama, xf::Mat<DST_T, ROWS, COLS, NPC> & dst)
Cmp
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void Cmp(Mat<ROWS, COLS, SRC1_T>& src1,Mat<ROWS, COLS, SRC2_T>& src2,
Mat<ROWS, COLS, DST_T>& dst,int cmp_op)
template<int CMP_OP, int SRC_T, int ROWS, int COLS, int NPC =1>
void compare(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1, xf::Mat<SRC_T, ROWS, COLS, NPC> & _src2,xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
CmpS
template<int ROWS, int COLS, int SRC_T, typename P_T, int DST_T>
void CmpS(Mat<ROWS, COLS, SRC_T>& src,  P_T value, Mat<ROWS, COLS, DST_T>& dst, int cmp_op)
template<int CMP_OP, int SRC_T, int ROWS, int COLS, int NPC =1>
void compare(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1, unsigned char _scl[XF_CHANNELS(SRC_T,NPC)],xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
Max
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void Max(Mat<ROWS, COLS, SRC1_T>& src1,
        Mat<ROWS, COLS, SRC2_T>& src2,
        Mat<ROWS, COLS, DST_T>& dst)
template<int SRC_T, int ROWS, int COLS, int NPC =1>
void Max(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1, xf::Mat<SRC_T, ROWS, COLS, NPC> & _src2,xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
MaxS
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void MaxS(Mat<ROWS, COLS, SRC_T>& src,
_T value, Mat<ROWS, COLS, DST_T>& dst)
template< int SRC_T, int ROWS, int COLS, int NPC =1>
void max(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1,  unsigned char _scl[XF_CHANNELS(SRC_T,NPC)],xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
Min
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void Min(Mat<ROWS, COLS, SRC1_T>& src1,
        Mat<ROWS, COLS, SRC2_T>& src2,
        Mat<ROWS, COLS, DST_T>& dst)
template< int SRC_T, int ROWS, int COLS, int NPC =1>
void Min(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1, xf::Mat<SRC_T, ROWS, COLS, NPC> & _src2,xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
MinS
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void MinS(Mat<ROWS, COLS, SRC_T>& src,
        _T value,Mat<ROWS, COLS, DST_T>& dst)
template< int SRC_T, int ROWS, int COLS, int NPC =1>
void min(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1,  unsigned char _scl[XF_CHANNELS(SRC_T,NPC)],xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
PaintMask
template<int SRC_T,int MASK_T,int ROWS,int COLS>
void PaintMask(
Mat<ROWS,COLS,SRC_T>   &_src,
Mat<ROWS,COLS,MASK_T>&_mask, 
Mat<ROWS,COLS,SRC_T>&_dst,Scalar<HLS_MAT_CN(SRC_T),HLS_TNAME(SRC_T)> _color)
template< int SRC_T,int MASK_T, int ROWS, int COLS,int NPC=1>
void paintmask(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src_mat, xf::Mat<MASK_T, ROWS, COLS, NPC> & in_mask, xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst_mat, unsigned char _color[XF_CHANNELS(SRC_T,NPC)])
Reduce
template<typename INTER_SUM_T, int ROWS, int COLS, int SRC_T, int DST_ROWS, int DST_COLS, int DST_T>
void Reduce(
         Mat<ROWS, COLS, SRC_T> &src,
         Mat<DST_ROWS, DST_COLS, DST_T> &dst,
         int dim,
         int op=HLS_REDUCE_SUM)
template< int REDUCE_OP, int SRC_T,int DST_T, int ROWS, int COLS,int ONE_D_HEIGHT, int ONE_D_WIDTH, int NPC=1>
void reduce(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src_mat,  xf::Mat<DST_T, ONE_D_HEIGHT, ONE_D_WIDTH, 1> & _dst_mat, unsigned char dim)
zero
template<int ROWS, int COLS, int SRC_T, int DST_T>
void Zero(Mat<ROWS, COLS, SRC_T>& src,
          Mat<ROWS, COLS, DST_T>& dst)
template< int SRC_T, int ROWS, int COLS, int NPC =1>
void zero(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1,xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
Sum
template<typename DST_T, int ROWS, int COLS, int SRC_T>
Scalar<HLS_MAT_CN(SRC_T), DST_T> Sum(
        Mat<ROWS, COLS, SRC_T>& src)
template< int SRC_T, int ROWS, int COLS, int NPC = 1>
void sum(xf::Mat<SRC_T, ROWS, COLS, NPC> & src1, double sum[XF_CHANNELS(SRC_T,NPC)] )
SubS
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void SubS(Mat<ROWS, COLS, SRC_T>& src,
        Scalar<HLS_MAT_CN(SRC_T), _T> scl,
        Mat<ROWS, COLS, DST_T>& dst)
template<int POLICY_TYPE, int SRC_T, int ROWS, int COLS, int NPC =1>
void SubS(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1,  unsigned char _scl[XF_CHANNELS(SRC_T,NPC)],xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
subRS
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void SubRS(Mat<ROWS, COLS, SRC_T>& src,
        Scalar<HLS_MAT_CN(SRC_T), _T> scl,
        Mat<ROWS, COLS, DST_T>& dst)
template<int POLICY_TYPE, int SRC_T, int ROWS, int COLS, int NPC =1>
void SubRS(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1, unsigned char _scl[XF_CHANNELS(SRC_T,NPC)],xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
Set
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void Set(Mat<ROWS, COLS, SRC_T>& src,
        Scalar<HLS_MAT_CN(SRC_T), _T> scl,
        Mat<ROWS, COLS, DST_T>& dst)
template< int SRC_T, int ROWS, int COLS, int NPC =1>
void set(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1,  unsigned char _scl[XF_CHANNELS(SRC_T,NPC)],xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
AbsDiff
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void AbsDiff(
        Mat<ROWS, COLS, SRC1_T>& src1,
        Mat<ROWS, COLS, SRC2_T>& src2,
        Mat<ROWS, COLS, DST_T>& dst)
template<int SRC_T, int ROWS, int COLS, int NPC =1>
void absdiff(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1,xf::Mat<SRC_T, ROWS, COLS, NPC> & _src2,xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
And
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void And(
        Mat<ROWS, COLS, SRC1_T>& src1,
        Mat<ROWS, COLS, SRC2_T>& src2,
        Mat<ROWS, COLS, DST_T>&  dst)
template<int SRC_T, int ROWS, int COLS, int NPC = 1>
void bitwise_and(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1, xf::Mat<SRC_T, ROWS, COLS, NPC> & _src2, xf::Mat<SRC_T, ROWS, COLS, NPC> &_dst)
Dilate
template<int Shape_type,int ITERATIONS,int SRC_T, int DST_T, typename KN_T,int IMG_HEIGHT,int IMG_WIDTH,int K_HEIGHT,int K_WIDTH>
void Dilate(Mat<IMG_HEIGHT, IMG_WIDTH, SRC_T>&_src,Mat<IMG_HEIGHT, IMG_WIDTH, DST_T&_dst,Window<K_HEIGHT,K_WIDTH,KN_T>&_kernel)
template<int BORDER_TYPE, int TYPE, int ROWS, int COLS,int K_SHAPE,int K_ROWS,int K_COLS, int ITERATIONS, int NPC=1> 
void dilate (xf::Mat<TYPE, ROWS, COLS, NPC> & _src, xf::Mat<TYPE, ROWS, COLS, NPC> & _dst,unsigned char _kernel[K_ROWS*K_COLS])
Duplicate
template<int ROWS, int COLS, int SRC_T, int DST_T>
void Duplicate(Mat<ROWS, COLS, SRC_T>& src,Mat<ROWS, COLS, DST_T>& dst1,Mat<ROWS, COLS, DST_T>& dst2)
template<int SRC_T, int ROWS, int COLS,int NPC>
void duplicateMat(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src, xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst1,xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst2)
EqualizeHist
template<int SRC_T, int DST_T,int ROW, int COL>
void EqualizeHist(Mat<ROW, COL, SRC_T>&_src,Mat<ROW, COL, DST_T>&_dst)
template<int SRC_T, int ROWS, int COLS, int NPC = 1>
void equalizeHist(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src,xf::Mat<SRC_T, ROWS, COLS, NPC> & _src1,xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst)
erode
template<int Shape_type,int ITERATIONS,int SRC_T, int DST_T, typename KN_T,int IMG_HEIGHT,int IMG_WIDTH,int K_HEIGHT,int K_WIDTH>
void Erode(Mat<IMG_HEIGHT, IMG_WIDTH, SRC_T>&_src,Mat<IMG_HEIGHT,IMG_WIDTH,DST_T>&_dst,Window<K_HEIGHT,K_WIDTH,KN_T>&_kernel)
template<int BORDER_TYPE, int TYPE, int ROWS, int COLS,int K_SHAPE,int K_ROWS,int K_COLS, int ITERATIONS, int NPC=1>
void erode (xf::Mat<TYPE, ROWS, COLS, NPC> & _src, xf::Mat<TYPE, ROWS, COLS, NPC> & _dst,unsigned char _kernel[K_ROWS*K_COLS])
FASTX
template<int SRC_T,int ROWS,int COLS>
void FASTX(Mat<ROWS,COLS,SRC_T> &_src,
Mat<ROWS,COLS,HLS_8UC1>&_mask,HLS_TNAME(SRC_T)_threshold,bool _nomax_supression)
template<int NMS,int SRC_T,int ROWS, int COLS,int NPC=1>
void fast(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src_mat,xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst_mat,unsigned char _threshold)
Filter2D
template<int SRC_T, int DST_T, typename KN_T, typename POINT_T,
int IMG_HEIGHT,int IMG_WIDTH,int K_HEIGHT,int K_WIDTH>
void Filter2D(Mat<IMG_HEIGHT, IMG_WIDTH, SRC_T> &_src,Mat<IMG_HEIGHT, IMG_WIDTH, DST_T>  &_dst,Window<K_HEIGHT,K_WIDTH,KN_T>&_kernel,Point_<POINT_T>anchor)
template<int BORDER_TYPE,int FILTER_WIDTH,int FILTER_HEIGHT, int SRC_T,int DST_T, int ROWS, int COLS,int NPC>
void filter2D(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src_mat,xf::Mat<DST_T, ROWS, COLS, NPC> & _dst_mat,short int filter[FILTER_HEIGHT*FILTER_WIDTH],unsigned char _shift)
GaussianBlur
template<int KH,int KW,typename BORDERMODE,int SRC_T,int DST_T,int ROWS,int COLS>
void GaussianBlur(Mat<ROWS, COLS, SRC_T>
&_src, Mat<ROWS, COLS, DST_T>	  
&_dst,double sigmaX=0,double sigmaY=0)
template<int FILTER_SIZE, int BORDER_TYPE, int SRC_T, int ROWS, int COLS,int NPC = 1>
void GaussianBlur(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src, xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst, float sigma)
Harris
template<int blockSize,int Ksize,typename KT,int SRC_T,int DST_T,int ROWS,int COLS>
void Harris(Mat<ROWS, COLS, SRC_T>	    
&_src,Mat<ROWS, COLS, DST_T>&_dst,KT k,int threshold
template<int FILTERSIZE,int BLOCKWIDTH, int NMSRADIUS,int SRC_T,int ROWS, int COLS,int NPC=1,bool USE_URAM=false>
void cornerHarris(xf::Mat<SRC_T, ROWS, COLS, NPC> & src,xf::Mat<SRC_T, ROWS, COLS, NPC> & dst,uint16_t threshold, uint16_t k)
CornerHarris
template<int blockSize,int Ksize,typename KT,int SRC_T,int DST_T,int ROWS,int COLS>
void CornerHarris(
Mat<ROWS, COLS, SRC_T>&_src,Mat<ROWS, COLS, DST_T>&_dst,KT k)
template<int FILTERSIZE,int BLOCKWIDTH, int NMSRADIUS,int SRC_T,int ROWS, int COLS,int NPC=1,bool USE_URAM=false>
void cornerHarris(xf::Mat<SRC_T, ROWS, COLS, NPC> & src,xf::Mat<SRC_T, ROWS, COLS, NPC> & dst,uint16_t threshold, uint16_t k
HoughLines2
template<unsigned int theta,unsigned int rho,typename AT,typename RT,int SRC_T,int ROW,int COL,unsigned int linesMax>
void HoughLines2(Mat<ROW,COL,SRC_T> &_src,
Polar_<AT,RT> (&_lines)[linesMax],unsigned int threshold)
template<unsigned int RHO,unsigned int THETA,int MAXLINES,int DIAG,int MINTHETA,int MAXTHETA,int SRC_T, int ROWS, int COLS,int NPC>
void HoughLines(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src_mat,float outputrho[MAXLINES],float outputtheta[MAXLINES],short threshold,short linesmax)
Integral
template<int SRC_T, int DST_T,
int ROWS,int COLS>
void Integral(Mat<ROWS, COLS, SRC_T>&_src,
        Mat<ROWS+1, COLS+1, DST_T>&_sum )
template<int SRC_TYPE,int DST_TYPE, int ROWS, int COLS, int NPC>
void integral(xf::Mat<SRC_TYPE, ROWS, COLS, NPC> & _src_mat, xf::Mat<DST_TYPE, ROWS, COLS, NPC> & _dst_mat)
Merge
template<int ROWS, int COLS, int SRC_T, int DST_T>
void Merge(
        Mat<ROWS, COLS, SRC_T>& src0,
        Mat<ROWS, COLS, SRC_T>& src1,
        Mat<ROWS, COLS, SRC_T>& src2,
        Mat<ROWS, COLS, SRC_T>& src3,
        Mat<ROWS, COLS, DST_T>& dst)
template<int SRC_T, int DST_T, int ROWS, int COLS, int NPC=1>
void merge(xf::Mat<SRC_T, ROWS, COLS, NPC> &_src1, xf::Mat<SRC_T, ROWS, COLS, NPC> &_src2, xf::Mat<SRC_T, ROWS, COLS, NPC> &_src3, xf::Mat<SRC_T, ROWS, COLS, NPC> &_src4, xf::Mat<DST_T, ROWS, COLS, NPC> &_dst)
MinMaxLoc
template<int ROWS, int COLS, int SRC_T, typename P_T>
void MinMaxLoc(Mat<ROWS, COLS, SRC_T>& src,
P_T* min_val,P_T* max_val,Point& min_loc,
Point& max_loc)
template<int SRC_T,int ROWS,int COLS,int NPC=0>
void minMaxLoc(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src,int32_t *min_value, int32_t *max_value,uint16_t *_minlocx, uint16_t *_minlocy, uint16_t *_maxlocx, uint16_t *_maxlocy )
Mul
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void Mul(Mat<ROWS, COLS, SRC1_T>& src1,
        Mat<ROWS, COLS, SRC2_T>& src2,
        Mat<ROWS, COLS, DST_T>& dst)
 template<int POLICY_TYPE, int SRC_T, int ROWS, int COLS, int NPC = 1>
void multiply(xf::Mat<SRC_T, ROWS, COLS, NPC> & src1, xf::Mat<SRC_T, ROWS, COLS, NPC> & src2, xf::Mat<SRC_T, ROWS, COLS, NPC> & dst,float scale)
Not
template<int ROWS, int COLS, int SRC_T, int DST_T>
void Not(Mat<ROWS, COLS, SRC_T>& src,
        Mat<ROWS, COLS, DST_T>& dst)
template<int SRC_T, int ROWS, int COLS, int NPC = 1>
void bitwise_not(xf::Mat<SRC_T, ROWS, COLS, NPC> & src, xf::Mat<SRC_T, ROWS, COLS, NPC> & dst)
Range
template<int ROWS, int COLS, int SRC_T, int DST_T, typename P_T>
void Range(Mat<ROWS, COLS, SRC_T>& src,
        Mat<ROWS, COLS, DST_T>& dst,
        P_T start,P_T end)
template<int SRC_T, int ROWS, int COLS,int NPC=1>
void inRange(xf::Mat<SRC_T, ROWS, COLS, NPC> & src,unsigned char lower_thresh,unsigned char upper_thresh,xf::Mat<SRC_T, ROWS, COLS, NPC> & dst)
Resize
template<int SRC_T, int ROWS,int COLS,int DROWS,int DCOLS>
void Resize (
        Mat<ROWS, COLS, SRC_T> &_src,
        Mat<DROWS, DCOLS, SRC_T> &_dst,
        int interpolation=HLS_INTER_LINEAR )
template<int INTERPOLATION_TYPE, int TYPE, int SRC_ROWS, int SRC_COLS, int DST_ROWS, int DST_COLS, int NPC, int MAX_DOWN_SCALE> 
void resize (xf::Mat<TYPE, SRC_ROWS, SRC_COLS, NPC> & _src, xf::Mat<TYPE, DST_ROWS, DST_COLS, NPC> & _dst)
sobel
template<int XORDER, int YORDER, int SIZE, int SRC_T, int DST_T, int ROWS,int COLS,int DROWS,int DCOLS>
void Sobel (Mat<ROWS, COLS, SRC_T>
&_src,Mat<DROWS, DCOLS, DST_T> &_dst)
template<int BORDER_TYPE,int FILTER_TYPE, int SRC_T,int DST_T, int ROWS, int COLS,int NPC=1,bool USE_URAM = false>
void Sobel(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src_mat,xf::Mat<DST_T, ROWS, COLS, NPC> & _dst_matx,xf::Mat<DST_T, ROWS, COLS, NPC> & _dst_maty)
split
template<int ROWS, int COLS, int SRC_T, int DST_T>
void Split(
        Mat<ROWS, COLS, SRC_T>& src,
        Mat<ROWS, COLS, DST_T>& dst0,
        Mat<ROWS, COLS, DST_T>& dst1,
        Mat<ROWS, COLS, DST_T>& dst2,
        Mat<ROWS, COLS, DST_T>& dst3)
template<int SRC_T, int DST_T, int ROWS, int COLS, int NPC=1> 
void extractChannel(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src_mat, xf::Mat<DST_T, ROWS, COLS, NPC> & _dst_mat, uint16_t _channel)
Threshold
template<int ROWS, int COLS, int SRC_T, int DST_T>
void Threshold(
        Mat<ROWS, COLS, SRC_T>& src,
        Mat<ROWS, COLS, DST_T>& dst,
        HLS_TNAME(SRC_T) thresh,
        HLS_TNAME(DST_T) maxval,
        int thresh_type)
template<int THRESHOLD_TYPE, int SRC_T, int ROWS, int COLS,int NPC=1>
void Threshold(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src_mat,xf::Mat<SRC_T, ROWS, COLS, NPC> & _dst_mat,short int thresh,short int maxval )
Scale
template<int ROWS, int COLS, int SRC_T, int DST_T, typename P_T>
void Scale(Mat<ROWS, COLS, SRC_T>& src,Mat<ROWS, COLS, DST_T>& dst, P_T scale=1.0,P_T shift=0.0)
template< int SRC_T,int DST_T, int ROWS, int COLS, int NPC = 1>
void scale(xf::Mat<SRC_T, ROWS, COLS, NPC> & src1, xf::Mat<DST_T, ROWS, COLS, NPC> & dst,float scale, float shift)
InitUndistortRectifyMapInverse
template<typename CMT, typename DT, typename ICMT, int ROWS, int COLS, int MAP1_T, int MAP2_T, int N>
void InitUndistortRectifyMapInverse (
 Window<3,3, CMT> cameraMatrix,DT(&distCoeffs)[N],Window<3,3, ICMT> ir, Mat<ROWS, COLS, MAP1_T>  &map1,Mat<ROWS, COLS, MAP2_T>  &map2,int noRotation=false)
template< int CM_SIZE, int DC_SIZE, int MAP_T, int ROWS, int COLS, int NPC >
void InitUndistortRectifyMapInverse (
		ap_fixed<32,12> *cameraMatrix,
		ap_fixed<32,12> *distCoeffs,
		ap_fixed<32,12> *ir,
		xf::Mat<MAP_T, ROWS, COLS, NPC> &_mapx_mat,xf::Mat<MAP_T, ROWS, COLS, NPC> &_mapy_mat,int _cm_size, int _dc_size)
Avg、mean、AvgStddev
template<typename DST_T, int ROWS, int COLS, int SRC_T>
DST_T Mean(Mat<ROWS, COLS, SRC_T>& src)
template<int SRC_T,int ROWS, int COLS,int NPC=1>void meanStdDev(xf::Mat<SRC_T, ROWS, COLS, NPC> & _src,unsigned short* _mean,unsigned short* _stddev)
CvtColor
template<typename CONVERSION,int SRC_T, int DST_T,int ROWS,int COLS>
void CvtColor(Mat<ROWS, COLS, SRC_T>	&_src,
        Mat<ROWS, COLS, DST_T>	&_dst)
色変換
注記: Reduce 以外のすべての関数では、1 クロックごとに N ピクセル (N は 2 のべき乗) を処理できます。

xfOpenCV ライブラリの使用

このセクションでは、SDx 開発環境での xfOpenCV ライブラリの使用方法を説明します。

注記: このセクションの手順は、必要なパッケージをすべてダウンロードおよびインストールしていることを前提としています。詳細は、使用要件 を参照してください。

include フォルダーには、コンピューター ビジョンまたは画像処理パイプラインを構築するのに必要なすべてのコンポーネントが含まれます。common および core フォルダーには、ライブラリ関数で基本的な関数、Mat クラス、およびマクロに必要なインフラストラクチャが含まれます。ライブラリ関数は、実行する操作に応じて featuresvideo、および imgproc の 3 つのフォルダーに分類されています。フォルダー名はわかりやすいものになっています。

ライブラリ関数を使用するには、SDx プロジェクトに include フォルダーへのパスを含める必要があります。include フォルダーのパスをコンパイラに読み込むと、使用するライブラリ関数に関連するヘッダー ファイルを含めることができるようになります。たとえば Harris コーナー検出器およびバイラテラル フィルターを使用するには、ホスト コードに次の行を含める必要があります。


#include “features/xf_harris.hpp” //for Harris Corner Detector
#include “imgproc/xf_bilateral_filter.hpp” //for Bilateral Filter
#include “video/xf_kalmanfilter.hpp”

ヘッダーを含めたら、xfOpenCV ライブラリ API リファレンスに説明されているように、ライブラリを使用できます。examples フォルダーの例を参考にしてください。

次の表に、ヘッダー ファイルの名前と、ライブラリ関数を含むフォルダー名を示します。

表 9. xfOpenCV ライブラリの内容
関数名 include 内のファイル パス
xf::accumulate imgproc/xf_accumulate_image.hpp
xf::accumulateSquare imgproc/xf_accumulate_squared.hpp
xf::accumulateWeighted imgproc/xf_accumulate_weighted.hpp
xf::absdiff、xf::add、xf::subtract、xf::bitwise_and、xf::bitwise_or、xf::bitwise_not、xf::bitwise_xor、xf::multiply、xf::Max、xf::Min、xf::compare、xf::zero、xf::addS、xf::SubS、xf::SubRS、xf::compareS、xf::MaxS、xf::MinS、xf::set core/xf_arithm.hpp
xf::addWeighted imgproc/xf_add_weighted.hpp
xf::bilateralFilter imgproc/xf_histogram.hpp
xf::boxFilter imgproc/xf_box_filter.hpp
xf::boundingbox imgproc/xf_boundingbox.hpp
xf::Canny imgproc/xf_canny.hpp
xf::Colordetect imgproc/xf_colorthresholding.hpp、imgproc/xf_bgr2hsv.hpp、imgproc/xf_erosion.hpp、imgproc/xf_dilation.hpp
xf::merge imgproc/xf_channel_combine.hpp
xf::extractChannel imgproc/xf_channel_extract.hpp
xf::convertTo imgproc/xf_convert_bitdepth.hpp
xf::crop imgproc/xf_crop.hpp
xf::filter2D imgproc/xf_custom_convolution.hpp
xf::nv122iyuv、xf::nv122rgba、xf::nv122yuv4、xf::nv212iyuv、xf::nv212rgba、xf::nv212yuv4、xf::rgba2yuv4、xf::rgba2iyuv、xf::rgba2nv12、xf::rgba2nv21、xf::uyvy2iyuv、xf::uyvy2nv12、xf::uyvy2rgba、xf::yuyv2iyuv、xf::yuyv2nv12、xf::yuyv2rgba、xf::rgb2iyuv、xf::rgb2nv12、xf::rgb2nv21、xf::rgb2yuv4、xf::rgb2uyvy、xf::rgb2yuyv、xf::rgb2bgr、xf::bgr2uyvy、xf::bgr2yuyv、xf::bgr2rgb、xf::bgr2nv12、xf::bgr2nv21、xf::iyuv2nv12、xf::iyuv2rgba、xf::iyuv2rgb、xf::iyuv2yuv4、xf::nv122uyvy、xf::nv122yuyv、xf::nv122nv21、xf::nv212rgb、xf::nv212bgr、xf::nv212uyvy、xf::nv212yuyv、xf::nv212nv12、xf::uyvy2rgb、xf::uyvy2bgr、xf::uyvy2yuyv、xf::yuyv2rgb、xf::yuyv2bgr、xf::yuyv2uyvy、xf::rgb2gray、xf::bgr2gray、xf::gray2rgb、xf::gray2bgr、xf::rgb2xyz、xf::bgr2xyz... imgproc/xf_cvt_color.hpp
xf::dilate imgproc/xf_dilation.hpp
xf::demosaicing imgproc/xf_demosaicing.hpp
xf::erode imgproc/xf_erosion.hpp
xf::fast features/xf_fast.hpp
xf::GaussianBlur imgproc/xf_gaussian_filter.hpp
xf::cornerHarris features/xf_harris.hpp
xf::calcHist imgproc/xf_histogram.hpp
xf::equalizeHist imgproc/xf_hist_equalize.hpp
xf::HOGDescriptor imgproc/xf_hog_descriptor.hpp
xf::Houghlines imgproc/xf_houghlines.hpp
xf::inRange imgproc/xf_inrange.hpp
xf::integralImage imgproc/xf_integral_image.hpp
xf::densePyrOpticalFlow video/xf_pyr_dense_optical_flow.hpp
xf::DenseNonPyrLKOpticalFlow video/xf_dense_npyr_optical_flow.hpp
xf::LUT imgproc/xf_lut.hpp
xf::KalmanFilter video/xf_kalmanfilter.hpp
xf::magnitude core/xf_magnitude.hpp
xf::MeanShift imgproc/xf_mean_shift.hpp
xf::meanStdDev core/xf_mean_stddev.hpp
xf::medianBlur imgproc/xf_median_blur.hpp
xf::minMaxLoc core/xf_min_max_loc.hpp
xf::OtsuThreshold imgproc/xf_otsuthreshold.hpp
xf::phase core/xf_phase.hpp
xf::paintmask imgproc/xf_paintmask.hpp
xf::pyrDown imgproc/xf_pyr_down.hpp
xf::pyrUp imgproc/xf_pyr_up.hpp
xf::reduce imgrpoc/xf_reduce.hpp
xf::remap imgproc/xf_remap.hpp
xf::resize imgproc/xf_resize.hpp
xf::scale imgproc/xf_scale.hpp
xf::Scharr imgproc/xf_scharr.hpp
xf::SemiGlobalBM imgproc/xf_sgbm.hpp
xf::Sobel imgproc/xf_sobel.hpp
xf::StereoPipeline imgproc/xf_stereo_pipeline.hpp
xf::sum imgproc/xf_sum.hpp
xf::StereoBM imgproc/xf_stereoBM.hpp
xf::SVM imgproc/xf_svm.hpp
xf::Threshold imgproc/xf_threshold.hpp
xf::warpTransform imgproc/xf_warp_transform.hpp

xfOpenCV ライブラリの例を使用するには、次の方法があります。

SDx GUI から xfOpenCV ライブラリをダウンロードして使用する方法

xfOpenCV は SDx GUI から直接ダウンロードできます。Linux プラットフォームのサンプル makefile を使用してプロジェクトをビルドするには、次の手順に従います。

  1. SDx IDE で [Xilinx][SDx Libraries] をクリックします。
  2. [Xilinx xfOpenCV Library] の横の [Download] ボタンをクリックします。

    図: SDx ライブラリ

    ライブラリは <home directory>/Xilinx/SDx/2019.1/xfopencv にダウンロードされます。ライブラリがダウンロードされると、新しいプロジェクトを作成するときにテンプレートのリストにライブラリに含まれるすべての例が表示されます。
    注記: ライブラリは、IDE メニュー オプションからどのプロジェクトにも追加できます。
  3. プロジェクトにライブラリを追加するには、SDx IDE で [Xilinx][SDx Libraries] をクリックします。
  4. [Xilinx xfOpenCV Library] を選択し、[Add to project] をクリックします。ドロップダウン リストに、ライブラリを追加する必要のあるプロジェクトのリストが表示されます。

xfOpenCV ライブラリの include/ フォルダーに含まれるすべてのヘッダーが、ローカル プロジェクト ディレクトリの <project_dir>/libs/xfopencv/include にコピーされます。この操作を実行すると、実行するライブラリに必要なすべての設定も指定されます。

サンプル makefile を使用した Linux でのプロジェクトの構築

Linux プラットフォームでサンプル makefile を使用してプロジェクトを構築するには、次の手順に従います。

  1. ターミナルを開きます。
  2. reVISION プラットフォームをビルドする場合は、環境変数 SYSROOT を <the path to platform folder>/sw/a53_linux/a53_linux/sysroot/aarch64-xilinx-linux に設定します。
  3. プラットフォーム変数を makefile のダウンロード済みプラットフォーム フォルダーをポイントするように変更します。ダウンロード済みプラットフォームのフォルダー名が変更されていないことを確認してください。
  4. reVISION プラットフォームをビルドする場合は、makefile の IDIRS および LDIRS 変数を次のように変更します。
    IDIRS = -I. -I${SYSROOT}/usr/include -I ../../include
    LDIRS = --sysroot=${SYSROOT} -L=/lib -L=/usr/lib -Wl,-rpath-link=${SYSROOT}/lib,-rpath-link=${SYSROOT}/usr/lib 
  5. 例をビルドするディレクトリに移動します。
    cd <path to example>
  6. reVISION プラットフォームをビルドする場合は、xf_headers.h ファイルの if および else 部分の両方に #include"opencv2/imgcodecs/imgcodecs.hpp" を追加します。
  7. SDx 開発環境を実行する環境変数を設定します。
    • C シェル:
      source <SDx tools install path>/settings.csh
    • bash シェル:
      source <SDx tools install path>/settings.sh
  8. ターミナルに make コマンドを入力します。sd_cardフォルダーが <path to example> に作成されます。
注記: reVISION 以外のプラットフォームをビルドする際は、手順 2、4、および 6 は無視します。

reVISION プラットフォームでの reVISION サンプルの使用

zcu104_rv_ss でバイラテラル フィルターのユニット テストを実行するには、次の手順に従います。

  1. デスクトップ アイコンをダブルクリックするか [スタート] メニューを使用して、SDx 開発環境を起動します。

    [Workspace Launcher] ダイアログ ボックスが表示されます。

  2. [Browse] をクリックしてプロジェクトを保存するワークスペース フォルダーを選択し、[OK] をクリックします。
    注記: Linux で SDx IDE を起動する前に、$SYSROOT 環境変数を設定したのと同じシェルを使用していることを確認します。これは通常、Linux ルート ファイル システムへのファイル パスです。

    SDx 開発環境のメイン ウィンドウが表示されます。新しいワークスペースを作成した場合は、[Welcome] タブが表示されます。[Welcome] タブは、[X] をクリックして閉じるか、[Minimize] アイコンをクリックして最小化できます。

  3. SDx 開発環境のメニュー バーから [File] > [New] > [Xilinx SDx Project] をクリックします。

    [New Project] ダイアログ ボックスが開きます。

  4. プロジェクト名を指定します (「Bilateral」など)。
  5. [Next] をクリックします。

    [Choose Hardware Platform] ページが開きます。

  6. [Choose Hardware Platform] ページで [Add Custom Platform] をクリックします。
  7. reVISION プラットフォーム ファイルを解凍したディレクトリに移動します。zcu104_rv_ss フォルダーを選択します。
  8. [Choose Hardware Platform] ページで [zcu104_rv_ss (custom)] を選択します。
  9. [Next] をクリックします。

    選択したプラットフォーム用のソース コード例をリストする [Templates] ページが表示されます。

  10. [Available Templates] から [bilateral - File I/O] を選択し、[Finish] をクリックします。
  11. project/src/examples/bilateral/ にある xf_headers.h ファイルの if および else 部分の両方に #include"opencv2/imgcodecs/imgcodecs.hpp" を追加します。
  12. [SDx Project Settings][Active build configurations] ドロップダウン リストをクリックしてアクティブ コンフィギュレーションを選択するか、ビルド コンフィギュレーションを作成します。

    標準ビルド コンフィギュレーションは [Debug] および [Release] です。最高のランタイム パフォーマンスを得るには、[Release] ビルド コンフィギュレーションを選択します。このビルド コンフィギュレーションでは、Debug ビルド コンフィギュレーションよりも高いコンパイラ最適化設定が使用されます。

    図: [SDx Project Settings] - [Active build configuration] ドロップダウン リスト



  13. [SDx Project Settings][Data motion network clock frequency (MHz)] を必要な周波数に設定します。
  14. [Project Explorer] ビューでプロジェクトを右クリックして [Build Project] をクリックするか、Ctrl + B キーを押してプロジェクトをビルドします。
  15. 作成された sd_card フォルダーの内容を SD カードにコピーします。sd_card フォルダーには、ZCU104 ボードでデザインを実行するのに必要なファイルがすべて含まれます。
  16. ZCU104 ボードのカード スロットに SD カードを挿入し、スイッチをオンにします。
    注記: ユーザー コマンドをボードに渡すには、シリアル ポート エミュレーター (Teraterm/Minicom) が必要です。
  17. 正しくブートしたら、Teraterm ターミナル (シリアル ポート エミュレーター) で次のコマンドを実行します。
    #cd /media/card
    #remount
  18. 対応する関数の .elf ファイルを実行します。

    詳細は、xfOpenCV ライブラリ関数のハードウェアでの使用 を参照してください。

reVISION 以外のプラットフォームでの xfOpenCV ライブラリの使用

このセクションでは、SDx™ 開発環境で reVISION 以外のプラットフォームに xfOpenCV ライブラリを使用する方法を説明します。xfOpenCV の例を正しくコンパイルするには、OpenCV ライブラリが必要です。reVISION 以外のプラットフォームでは OpenCV ライブラリを含めることは前提条件ではないので、互換性のある libjpeg.so を使用して OpenCV ライブラリをインストールおよびコンパイルする必要があります。

注記: このセクションの手順は、必要なパッケージをすべてダウンロードおよびインストールしていることを前提としています。詳細は、使用要件 を参照してください。

xfOpenCV ライブラリを SDx プロジェクトにインポートしてカスタム プラットフォームで実行するには、次の手順に従います。

  1. デスクトップ アイコンをダブルクリックするか [スタート] メニューを使用して、SDx 開発環境を起動します。

    [Workspace Launcher] ダイアログ ボックスが表示されます。

  2. [Browse] をクリックしてプロジェクトを保存するワークスペース フォルダーを選択し、[OK] をクリックします。

    SDx 開発環境のメイン ウィンドウが表示されます。新しいワークスペースを作成した場合は、[Welcome] タブが表示されます。[Welcome] タブは、[X] をクリックして閉じるか、[Minimize] アイコンをクリックして最小化できます。

  3. SDx 開発環境のメニュー バーから [File] > [New] > [Xilinx SDx Project] をクリックします。

    [New Project] ダイアログ ボックスが開きます。

  4. プロジェクト名を指定します (「Test」など)。
  5. [Next] をクリックします。

    [Choose Hardware Platform] ページが開きます。

  6. [Choose Hardware Platform] ページでプラットフォーム (zcu102 など) を選択します。
  7. [Next] をクリックします。

    [Choose Software Platform and Target CPU] ページが表示されます。

  8. [Choose Software Platform and Target CPU] ページで、ソフトウェア プラットフォームおよびターゲット CPU を選択します。たとえば、[CPU] ドロップダウン リストから ZC702 および ZC706 reVISION プラットフォーム用に [A9] を選択します。
  9. [Next] をクリックします。選択したプラットフォーム用のソース コード例をリストする [Templates] ページが表示されます。
  10. [Available Templates] から [Empty Application] を選択し、[Finish] をクリックします。

    [New Project] ダイアログ ボックスが閉じます。新しいプロジェクトが指定した設定で作成されます。[SDx Project Settings] が表示されます。このパネルの右下に進捗状況バーがあります。C/C++ Indexer が終了するのを待ちます。

  11. 標準ビルド コンフィギュレーションは [Debug] および [Release] です。最高のランタイム時にタイム パフォーマンスを得るには、[Release] ビルド コンフィギュレーションを選択します。このビルド コンフィギュレーションでは、Debug ビルド コンフィギュレーションよりも高いコンパイラ最適化設定が使用されます。

    図: [SDx Project Settings] - [Active build configuration] ドロップダウン リスト



  12. [SDx Project Settings][Data motion network clock frequency (MHz)] を必要な周波数に設定します。
  13. [Generate bitstream] および [Generate SD card Image] チェック ボックスをオンにします。
  14. [Project Explorer] ビューで新しく作成したプロジェクトを右クリックします。
  15. [C/C++ Build Settings] をクリックします。

    [Properties for <project>] ダイアログ ボックスが表示されます。

  16. [Tool Settings] タブをクリックします。
  17. [SDS++ Compiler] > [Directories] を展開します。
  18. アイコンをクリックして [Include Paths] リストに "<xfopencv_location>\include" および "<OpenCV_location>\include" フォルダーを追加します。

    注記: カスタム プラットフォームに対しては、ザイリンクスにより OpenCV ザライブラリは提供されません。ユーザーがライブラリを提供する必要があります。ザイリンクスが提供する OpenCV ライブラリを使用するには、reVISION プラットフォームを使用してください。

    図: SDS++ コンパイラ設定



  19. 同じページで [SDS++ Compiler] > [Inferred Options] > [Software Platform] を選択し、[Software Platform Inferred Flags] フィールドで「-hls-target 1」を指定します。
  20. [Apply] をクリックします。
  21. [SDS++ Linker] > [Libraries] を展開します。
  22. アイコンをクリックして [Libraries(-l)] リストに次のライブラリを追加します。これらのライブラリは OpenCV で必要です。
    • opencv_core
    • opencv_imgproc
    • opencv_imgcodecs
    • opencv_features2d
    • opencv_calib3d
    • opencv_flann
    • opencv_video
    • opencv_videoio
  23. アイコンをクリックして [Libraries search path (-L)] リストに <opencv_Location>/lib フォルダーを追加します。

    注記: カスタム プラットフォームに対しては、ザイリンクスにより OpenCV ザライブラリは提供されません。ユーザーがライブラリを提供する必要があります。ザイリンクスが提供する OpenCV ライブラリを使用するには、reVISION プラットフォームを使用してください。

    図: SDS++ リンカー設定



  24. [Apply] をクリックして設定を保存します。
  25. [OK] をクリックして [Properties for <project>] ダイアログ ボックスを閉じます。
  26. [Project Explorer] ビューで新しく作成したプロジェクトを展開します。
  27. src フォルダーを右クリックし、[Import] をクリックします。[Import] ダイアログ ボックスが開きます。
  28. [File System] を選択して [Next] をクリックします。
  29. [Browse] をクリックして <xfopencv_Location>/examples フォルダーに移動します。
  30. インポートするライブラリに対応するフォルダー (accumulate など) を選択します。

    図: ライブラリのサンプル ソース ファイルのインポート



  31. [Project Explorer] ビューでライブラリ関数を右クリックし、[Toggle HW/SW] をクリックして関数をハードウェアに移動します。

    図: ライブラリ関数のハードウェアへの移動



  32. [Project Explorer] ビューでプロジェクトを右クリックして [Build Project] をクリックするか、Ctrl + B キーを押してプロジェクトをビルドします。

    ビルド プロセスは、ホスト マシンの処理能力およびデザインの複雑性によって数分から数時間かかります。ほとんどの時間は、ハードウェアに配置するよう指定されたルーチンの処理に費やされます。

  33. 作成された .\<workspace>\<function>\Release\sd_card フォルダーの内容を SD カードにコピーします。sd_card フォルダーには、ボードでデザインを実行するのに必要なファイルがすべて含まれます。
  34. ボードのカード スロットに SD カードを挿入し、スイッチをオンにします。

    注記: ユーザー コマンドをボードに渡すには、シリアル ポート エミュレーター (Teraterm/Minicom) が必要です。
  35. 正しくブートしたら、./mnt フォルダーに移動してプロンプトで次のコマンドを実行します。
    #cd /mnt
    注記: OpenCV ライブラリはルート ファイルシステムのポートであると想定されます。そうでない場合は、$ export LD_LIBRARY_PATH=<location of OpenCV libraries>/lib コマンドを使用して OpenCV ライブラリの場所を LD_LIBRARY_PATH に追加します。
  36. .elf 実行ファイルを実行します。詳細は、xfOpenCV ライブラリ関数のハードウェアでの使用 を参照してください。

ハードウェア カーネル コンフィギュレーションの変更

ハードウェア カーネル コンフィギュレーションを変更するには、次の手順に従います。
  1. <path to xfOpenCV git folder>/xfOpenCV/examples/<function>/xf_config_params.h ファイルをアップデートます。
  2. makefile と xf_config_params.h ファイルをアップデートします。
    1. makefile で関数名を含む行を見つけます。バイラテラル フィルターの場合、makefile 内の行は xf::BilateralFilter<3,1,0,1080,1920,1> です。
    2. xf_config_params.h ファイルに加えた変更を反映するために makefile のテンプレート パラメーターをアップデートします。詳細は、xfOpenCV ライブラリ API リファレンス を参照してください。

xfOpenCV ライブラリ関数のハードウェアでの使用

次の表に、xfOpenCV ライブラリ関数と、それらに対応する例をハードウェアで実行するコマンドを示します。デザインが完全にビルドされており、ボードが正しく起動されている必要があります。

表 10. xfOpenCV ライブラリ関数のハードウェアでの使用
関数名 ハードウェアでの使用方法
accumulate xf::accumulate ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
accumulatesquared xf::accumulateSquare ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
accumulateweighted xf::accumulateWeighted ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
addS xf::addS ./<実行ファイル名>.elf <入力画像へのパス>
arithm xf::absdiff、xf::add、xf::subtract、xf::bitwise_and、xf::bitwise_or、xf::bitwise_not、xf::bitwise_xor ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
addweighted xf::addWeighted ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
Bilateralfilter xf::bilateralFilter ./<実行ファイル名>.elf <入力画像へのパス>
Boxfilter xf::boxFilter ./<実行ファイル名>.elf <入力画像へのパス>
Boundingbox xf::boundingbox ./<実行ファイル名>.elf <入力画像へのパス> <ROI の数>
Canny xf::Canny ./<実行ファイル名>.elf <入力画像へのパス>
channelcombine xf::merge ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス> <入力画像 3 へのパス> <入力画像 4 へのパス>
Channelextract xf::extractChannel ./<実行ファイル名>.elf <入力画像へのパス>
Colordetect xf::bgr2hsv、xf::colorthresholding、xf:: erode、および xf:: dilate ./<実行ファイル名>.elf <入力画像へのパス>
compare xf::compare ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
compareS xf::compareS ./<実行ファイル名>.elf <入力画像へのパス>
Convertbitdepth xf::convertTo ./<実行ファイル名>.elf <入力画像へのパス>
Cornertracker xf::cornerTracker ./exe <入力ビデオ> <フレーム数> <Harris しきい値> <Harris コーナーをリセットするまでのフレーム数>
crop xf::crop ./<実行ファイル名>.elf <入力画像へのパス>
Customconv xf::filter2D ./<実行ファイル名>.elf <入力画像へのパス>
cvtcolor IYUV2NV12 xf::iyuv2nv12 ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス> <入力画像 3 へのパス>
cvtcolor IYUV2RGBA xf::iyuv2rgba ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス> <入力画像 3 へのパス>
cvtcolor IYUV2YUV4 xf::iyuv2yuv4 ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス> <入力画像 3 へのパス> <入力画像 4 へのパス> <入力画像 5 へのパス> <入力画像 6 へのパス>
cvtcolor NV122IYUV xf::nv122iyuv ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
cvtcolor NV122RGBA xf::nv122rgba ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
cvtcolor NV122YUV4 xf::nv122yuv4 ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
cvtcolor NV212IYUV xf::nv212iyuv ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
cvtcolor NV212RGBA xf::nv212rgba ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
cvtcolor NV212YUV4 xf::nv212yuv4 ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
cvtcolor RGBA2YUV4 xf::rgba2yuv4 ./<実行ファイル名>.elf <入力画像へのパス>
cvtcolor RGBA2IYUV xf::rgba2iyuv ./<実行ファイル名>.elf <入力画像へのパス>
cvtcolor RGBA2NV12 xf::rgba2nv12 ./<実行ファイル名>.elf <入力画像へのパス>
cvtcolor RGBA2NV21 xf::rgba2nv21 ./<実行ファイル名>.elf <入力画像へのパス>
cvtcolor UYVY2IYUV xf::uyvy2iyuv ./<実行ファイル名>.elf <入力画像へのパス>
cvtcolor UYVY2NV12 xf::uyvy2nv12 ./<実行ファイル名>.elf <入力画像へのパス>
cvtcolor UYVY2RGBA xf::uyvy2rgba ./<実行ファイル名>.elf <入力画像へのパス>
cvtcolor YUYV2IYUV xf::yuyv2iyuv ./<実行ファイル名>.elf <入力画像へのパス>
cvtcolor YUYV2NV12 xf::yuyv2nv12 ./<実行ファイル名>.elf <入力画像へのパス>
cvtcolor YUYV2RGBA xf::yuyv2rgba ./<実行ファイル名>.elf <入力画像へのパス>
Demosaicing xf::demosaicing ./<実行ファイル名>.elf <入力画像へのパス>
Difference of Gaussian xf:: GaussianBlur、xf:: duplicateMat、xf:: delayMat、および xf::subtract ./<実行ファイル名>.elf <入力画像へのパス>
Dilation xf::dilate ./<実行ファイル名>.elf <入力画像へのパス>
Erosion xf::erode ./<実行ファイル名>.elf <入力画像へのパス>
Fast xf::fast ./<実行ファイル名>.elf <入力画像へのパス>
Gaussianfilter xf::GaussianBlur ./<実行ファイル名>.elf <入力画像へのパス>
Harris xf::cornerHarris ./<実行ファイル名>.elf <入力画像へのパス>
Histogram xf::calcHist ./<実行ファイル名>.elf <入力画像へのパス>
Histequialize xf::equalizeHist ./<実行ファイル名>.elf <入力画像へのパス>
Hog xf::HOGDescriptor ./<実行ファイル名>.elf <入力画像へのパス>
Houghlines xf::HoughLines ./<実行ファイル名>.elf <入力画像へのパス>
inRange xf::inRange ./<実行ファイル名>.elf <入力画像へのパス>
Integralimg xf::integralImage ./<実行ファイル名>.elf <入力画像へのパス>
Lkdensepyrof xf::densePyrOpticalFlow ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
Lknpyroflow xf::DenseNonPyrLKOpticalFlow ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
Lut xf::LUT ./<実行ファイル名>.elf <入力画像へのパス>
Kalman Filter xf::KalmanFilter ./<実行ファイル名>.elf
Magnitude xf::magnitude ./<実行ファイル名>.elf <入力画像へのパス>
Max xf::Max ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
MaxS xf::MaxS ./<実行ファイル名>.elf <入力画像へのパス>
meanshifttracking xf::MeanShift ./<実行ファイル名>.elf <入力ビデオへのパス/入力画像ファイル> <追跡する物体の数>
meanstddev xf::meanStdDev ./<実行ファイル名>.elf <入力画像へのパス>
medianblur xf::medianBlur ./<実行ファイル名>.elf <入力画像へのパス>
Min xf::Min ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
MinS xf::MinS ./<実行ファイル名>.elf <入力画像へのパス>
Minmaxloc xf::minMaxLoc ./<実行ファイル名>.elf <入力画像へのパス>
otsuthreshold xf::OtsuThreshold ./<実行ファイル名>.elf <入力画像へのパス>
paintmask xf::paintmask ./<実行ファイル名>.elf <入力画像へのパス>
Phase xf::phase ./<実行ファイル名>.elf <入力画像へのパス>
Pyrdown xf::pyrDown ./<実行ファイル名>.elf <入力画像へのパス>
Pyrup xf::pyrUp ./<実行ファイル名>.elf <入力画像へのパス>
reduce xf::reduce ./<実行ファイル名>.elf <入力画像へのパス>
remap xf::remap ./<実行ファイル名>.elf <入力画像へのパス> <mapx データへのパス> <mapy データへのパス>
Resize xf::resize ./<実行ファイル名>.elf <入力画像へのパス>
scale xf::scale ./<実行ファイル名>.elf <入力画像へのパス>
scharrfilter xf::Scharr ./<実行ファイル名>.elf <入力画像へのパス>
set xf::set ./<実行ファイル名>.elf <入力画像へのパス>
SemiGlobalBM xf::SemiGlobalBM ./<実行ファイル名>.elf <左画像へのパス> <右画像へのパス>
sobelfilter xf::Sobel ./<実行ファイル名>.elf <入力画像へのパス>
stereopipeline xf::StereoPipeline ./<実行ファイル名>.elf <左画像へのパス> <右画像へのパス>
stereolbm xf::StereoBM ./<実行ファイル名>.elf <左画像へのパス> <右画像へのパス>
subRS xf::SubRS ./<実行ファイル名>.elf <入力画像へのパス>
subS xf::SubS ./<実行ファイル名>.elf <入力画像へのパス>
sum xf::sum ./<実行ファイル名>.elf <入力画像 1 へのパス> <入力画像 2 へのパス>
Svm xf::SVM ./<実行ファイル名>.elf
threshold xf::Threshold ./<実行ファイル名>.elf <入力画像へのパス>
warptransform xf::warpTransform ./<実行ファイル名>.elf <入力画像へのパス>
zero xf::zero ./<実行ファイル名>.elf <入力画像へのパス>