読者です 読者をやめる 読者になる 読者になる

日曜技術者のメモ

趣味でやった事のメモ書きです。

Vivado HLSでOpenCVを試してみた

仕事が忙しく更新が止まってます。4月に入れば更新速度上げれそうです。

さて、先週ツイートしましたがFPGA2013というイベントの資料を見つけました。


で、その資料の中にVivadoHLSのOpenCVがちょっとだけ載っていましたので試してみました。

結果からいうと合成はできた(っぽい)けどシミュレーションがエラーで動かない状態です。

以下コード

  • TB.cpp
#include "TOP.h"
#include "opencv2/opencv.hpp" //OpenCV2.4だと必要

//using namespace cv;

int main(void) {
	IplImage* src=cvLoadImage("test_1080p.bmp");
	IplImage* dst=cvCreateImage(cvGetSize(src),
			src->depth, src->nChannels);
	AXI_STREAM src_axi, dst_axi;
	IplImage2AXIvideo(src, src_axi);
	top(src_axi, dst_axi, src->height, src->width);
	AXIvideo2IplImage(dst_axi, dst);
	cvSaveImage("result_1080p.bmp", dst);
	cvReleaseImage(&src);
	cvReleaseImage(&dst);

	return(1);
}
  • top.h
#ifndef __TOP__H__
#define __TOP__H__

#include "hls_video.h" // header file of HLS video library
#include "hls_opencv.h" // header file of OpenCV I/O
// typedef video library core structures
typedef hls::AXI_Base<32> AXI_PIXEL;
typedef hls::stream<AXI_PIXEL> AXI_STREAM;
//typedef hls::Scalar<3, uchar> RGB_PIXEL; //ucharが見つからない
typedef hls::Scalar<3, unsigned char> RGB_PIXEL;
typedef hls::Mat<1080,1920,HLS_8UC3> RGB_IMAGE;

void top(AXI_STREAM& src_axi, AXI_STREAM& dst_axi, int rows, int cols);

#endif //__TOP__H__
  • top.cpp
#include "TOP.h"
//#include "ap_interfaces.h" 


void top(AXI_STREAM& src_axi, AXI_STREAM& dst_axi, int rows, int cols){
	//Create AXI streaming interfaces for the core
	#pragma HLS RESOURCE core=AXIS variable=src_axi metadata="-bus_bundle INPUT_STREAM"
	#pragma HLS RESOURCE core=AXIS variable=dst_axi metadata="-bus_bundle OUTPUT_STREAM"
	#pragma HLS RESOURCE core=AXI_SLAVE variable=rows metadata="-bus_bundle CONTROL_BUS"
	#pragma HLS RESOURCE core=AXI_SLAVE variable=cols metadata="-bus_bundle CONTROL_BUS"
	#pragma HLS RESOURCE core=AXI_SLAVE variable=return metadata="-bus_bundle CONTROL_BUS"
	//RGB_IMAGE img[6];

	RGB_IMAGE img[5]; //hls::Sobelをはずしたので要素を減らす

	RGB_PIXEL pix(100,100,100);
	#pragma HLS dataflow
	hls::AXIvideo2Mat(src_axi, img[0]);
	//hls::Sobel(img[0], img[1], 1, 0); //hls::Sobelは未実装だった
	hls::SubS(img[0], pix, img[1]);
	hls::Scale(img[1], img[2], 2, 0);
	hls::Erode(img[2], img[3]);
	hls::Dilate(img[3], img[4]);
	hls::Mat2AXIvideo(img[4], dst_axi);
}

OpenCVのライブラリはVivadoHLS内になかったので別途インストールしました(OpenCV2.4)
Windowsでのライブラリパスの設定方法が分からなかったので以下ベージを参照しました。

http://stackoverflow.com/questions/10860352/getting-started-with-opencv-2-4-and-mingw-on-windows-7


この記述でシミュレーションを実行すると

 e:/xilinx/vivado_hls/2012.4/msys/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: cannot find -lopencv_core240
 e:/xilinx/vivado_hls/2012.4/msys/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: cannot find -lopencv_highgui240

ライブラリを読めてないようです。(x86のライブラリで大丈夫なはず・・・)
Windowsだとどこに問題があるか調べにくいのでLinux環境で試せたらやってみたいです。