Vivado HLSでOpenCVを試してみた
仕事が忙しく更新が止まってます。4月に入れば更新速度上げれそうです。
さて、先週ツイートしましたがFPGA2013というイベントの資料を見つけました。
FPGA2013 Pre-Conference Tutorials tcfpga.org/fpga2013/
— michuさん (@ginnyu_tei) 2013年3月9日
ちょっと古いけどVivado HLSとAlteraのOpenCLについて書いてる VivadoはOpenCVの記述例が少し載ってる。
— michuさん (@ginnyu_tei) 2013年3月9日
で、その資料の中に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環境で試せたらやってみたいです。