1.幀差法原理
幀差法的實現非常簡單:
?
如圖可見,由目標運動引起的運動變化區域包括運動目標在前后兩幀中的共同位置(圖中黑色區域)、在當前幀中新顯露出的背景區域和新覆蓋的背景區域三部分。
數學原理:
2.vivado HLS實現
Vivado HSL是xilinx公司推出的高層次綜合工具,使用C/C++就能實現傳統的verilog語言進行的開發,降低了開發難度,內置的hls視頻庫實現了基本的opencv函數,直接調用可以實現轉換。
(1)打開HLS如下圖
(2)創建新工程
(3)一直點擊next,出現下圖
(5)選擇完成后如下圖
(6)點擊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(img_01, img_1);
hls::CvtColor(img_02, img_2);
hls::AbsDiff(img_1,img_2,img_4);
hls::Mat2AXIvideo(img_4, OUTPUT_STREAM);
}
(8)繼續右鍵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 》 AXI_STREAM_IN;
typedef hls::stream 》 AXI_STREAM_OUT;
typedef hls::Mat RGB_IMAGE;
typedef hls::Mat GRAY_IMAGE;
//頂層綜合函數
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)點擊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》//獲取圖像數據
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);
//釋放內存
cvReleaseImage (&src1);
cvReleaseImage (&src2);
cvReleaseImage (&dst1);
}
}
(10)點擊Test Bench 右鍵 add file 添加兩幅運動圖像,文件名與top.h中的
#define INPUT_IMAGE1 “a1.jpg”
#define INPUT_IMAGE2 “a2.jpg”
相同
(11)添加頂層文件
右鍵工程 Project Settings --?Synthesis
如上圖 點擊OK
(12)Solution
選擇Active Solution 等待完成 如下圖
(13)C Simulation
點擊ok 等待完成
(14)查看生成圖片
工程文件中 solution1文件夾下csim下build
生成圖像如上圖
工程完成
(15)生成IP文件 點擊如圖按鈕
點擊OK 完成IP的生成
生成的IP
然后就可以在vivado中調用IP了。
評論
查看更多