ひでみのアイデア帳

くだらないことなんだけど、忘れないために・・・

SDx+yocto+OpenCV3.1+FPGA(2)

さて、どうしたものか・・・

Vivado HLSの環境まで手を入れるのは面倒だし・・・

じゃぁ、ソースコードを分離して、見たらどうかな?

それでも同じだった。

あぁ、FPGA化する関数があるソースコードのヘッダファイルは引きずってしまうのね。

自作高位合成処理と一緒だ(笑)

そこでソースコードを分離して、次のようにラッパー関数で繋いでみた。

/*
 * OpenCV フィルタサンプル - ラプラシアン
 */
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>

extern int wrapper_conv_data(unsigned char* img_in, unsigned char* img_out, int width, int height);

int main( int argc, char** argv )
{

  // Read lena-chan with Grayscale
  cv::Mat src = cv::imread("lena.png", 0);

  cv::Mat laplacian, tmp;
  cv::Laplacian(src, tmp, CV_32F, 3);
  cv::convertScaleAbs(tmp, laplacian, 1, 0);

  unsigned char* img = (unsigned char*)&laplacian.data[0];
  unsigned char* img2 = (unsigned char*)&tmp.data[0];

  wrapper_conv_data(img, img2, src.cols, src.rows);

  // Write for laplacian not kuracian
  cv::imwrite("lena_laplacian.png", laplacian);

  return 0;
}
#pragma SDS data zero_copy(img_in)
#pragma SDS data zero_copy(img_out)
int conv_data(unsigned char img_in[65536], unsigned char img_out[65536], int width, int height)
{

    for(int y = 0; y < height; y++){
        for(int x = 0; x < width; x++){
            img_out[y * width + x] = img_in[y * width + x];
        }
    }

    return 0;
}

int wrapper_conv_data(unsigned char* img_in, unsigned char* img_out, int width, int height)
{
    return conv_data(&img_in[0], &img_out[0], width, height);
}

そこでソースコードを分離して、ラッパー関数を用意して、コンパイルした。

お〜、なんか合成まで進んで時間がかかるようになったぞ。

時間待って、時間待って・・・

チーン!

出来上がった。

FPGAの論理合成まで進むかを試したかったので、conv_dataのメモリは65536で行っている。

次のフェーズではちゃんと処理する機能を作成してFPGAにブチ込んでみよう。

p.s.

ちょっと、落とし穴があった。

Vivado_HLS側は基本的に追加ヘッダファイルを見に行けないらしい。