さて、どうしたものか・・・
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にブチ込んでみよう。
ちょっと、落とし穴があった。
Vivado_HLS側は基本的に追加ヘッダファイルを見に行けないらしい。
writed: 2017/01/14/ 16:00:04