www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > FPGA開源工作室

基于vivado HLS的幀差圖像實(shí)現(xiàn)

1. 幀差法原理

幀差法的實(shí)現(xiàn)非常簡單:

如圖可見,由目標(biāo)運(yùn)動(dòng)引起的運(yùn)動(dòng)變化區(qū)域包括運(yùn)動(dòng)目標(biāo)在前后兩幀中的共同位置(圖中黑色區(qū)域)、在當(dāng)前幀中新顯露出的背景區(qū)域和新覆蓋的背景區(qū)域三部分。

數(shù)學(xué)原理:

2.vivado HLS實(shí)現(xiàn)

Vivado HSLxilinx公司推出的高層次綜合工具,使用C/C++就能實(shí)現(xiàn)傳統(tǒng)的verilog語言進(jìn)行的開發(fā),降低了開發(fā)難度,內(nèi)置的hls視頻庫實(shí)現(xiàn)了基本的opencv函數(shù),直接調(diào)用可以實(shí)現(xiàn)轉(zhuǎn)換。

1)打開HLS如下圖

2)創(chuàng)建新工程

3一直點(diǎn)擊next,出現(xiàn)下圖

4選擇FPGA芯片類型 我的是7020-2

5)選擇完成后如下圖

6點(diǎn)擊finish后,如下圖

7)右鍵source 選擇new file 輸入文件名 top.cpp

#include "top.h"

#include "hls_math.h"

void hls_counter_color1(AXI_STREAM_IN& INPUT_STREAM1,

AXI_STREAM_IN& INPUT_STREAM2, AXI_STREAM_OUT& OUTPUT_STREAM, int rows,

int cols) {

#pragma HLS INTERFACE axis port=INPUT_STREAM1

#pragma HLS INTERFACE axis port=INPUT_STREAM2

#pragma HLS INTERFACE axis port=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"

#pragma HLS INTERFACE ap_stable port=rows

#pragma HLS INTERFACE ap_stable port=cols

RGB_IMAGE img_01(rows, cols);

RGB_IMAGE img_02(rows, cols);

GRAY_IMAGE img_1(rows, cols);

GRAY_IMAGE img_2(rows, cols);

GRAY_IMAGE img_4(rows, cols);

GRAY_IMAGE img_5(rows, cols);

RGB_IMAGE img_3(rows, cols);

#pragma HLS dataflow

hls::AXIvideo2Mat(INPUT_STREAM1, img_01);

hls::AXIvideo2Mat(INPUT_STREAM2, img_02);

hls::CvtColor<HLS_RGB2GRAY>(img_01, img_1);

hls::CvtColor<HLS_RGB2GRAY>(img_02, img_2);

hls::AbsDiff(img_1,img_2,img_4);

hls::Mat2AXIvideo(img_4, OUTPUT_STREAM);

}

8)繼續(xù)右鍵source 選擇new file 輸入 top.h

#ifndef _TOP_H_

#define _TOP_H_

#include "hls_video.h"

//#include "ap_int.h"

//#include

#define MAX_WIDTH  2048

#define MAX_HEIGHT 1536

#define INPUT_IMAGE1 "a1.jpg"

#define INPUT_IMAGE2 "a2.jpg"

//#define INPUT_IMAGE           "test_1080p.bmp"

#define OUTPUT_IMAGE "result_1080p.jpg"

#define OUTPUT_IMAGE_GOLDEN "result_1080p_golden.bmp"

// typedef video library core structures

typedef hls::stream<ap_axiu<32,1,1,1> > AXI_STREAM_IN;

typedef hls::stream<ap_axiu<32,1,1,1> > AXI_STREAM_OUT;

typedef hls::Mat RGB_IMAGE;

typedef hls::Mat GRAY_IMAGE;

//頂層綜合函數(shù)

void hls_counter_color1(AXI_STREAM_IN& src_axi1,AXI_STREAM_IN& src_axi2, AXI_STREAM_OUT& dst_axi, int rows, int cols);

#endif

9點(diǎn)擊Test Bench 右鍵 new file 輸入文件名 test.cpp

#include "top.h"

#include "hls_opencv.h"

#include "iostream"

using namespace std;

using namespace cv;

const int N = 2;

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

for (int i = 0; i < N; i++) {

//獲取圖像數(shù)據(jù)

IplImage* src1 = cvLoadImage(INPUT_IMAGE1);

IplImage* src2 = cvLoadImage(INPUT_IMAGE2);

IplImage* dst1 = cvCreateImage(cvGetSize(src1), 8,1);

AXI_STREAM_IN src_axi1;

AXI_STREAM_IN src_axi2;

AXI_STREAM_OUT dst_axi;

IplImage2AXIvideo(src1, src_axi1);

IplImage2AXIvideo(src2, src_axi2);

hls_counter_color1(src_axi1, src_axi2, dst_axi, src1->height,

src1->width);

AXIvideo2IplImage(dst_axi, dst1);

cvSaveImage(OUTPUT_IMAGE, dst1);

//釋放內(nèi)存

cvReleaseImage (&src1);

cvReleaseImage (&src2);

cvReleaseImage (&dst1);

}

}

10點(diǎn)擊Test Bench 右鍵 add file 添加兩幅運(yùn)動(dòng)圖像,文件名與top.h中的

#define INPUT_IMAGE1 "a1.jpg"

#define INPUT_IMAGE2 "a2.jpg"

相同

11)添加頂層文件

右鍵工程 Project Settings --àSynthesis

如上圖 點(diǎn)擊OK

12Solution

選擇Active Solution 等待完成 如下圖

13C Simulation

點(diǎn)擊ok 等待完成

14查看生成圖片

工程文件中 solution1文件夾下csimbuild

生成圖像如上圖

工程完成

15生成IP文件 點(diǎn)擊如圖按鈕

點(diǎn)擊OK 完成IP的生成


生成的IP

然后就可以在vivado中調(diào)用IP了,我們下期再講如何調(diào)用


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉