专栏首页FPGA开源工作室基于vivado HLS的帧差图像实现

基于vivado HLS的帧差图像实现

基于vivado HLS的帧差图像实现

作者:晨

1. 帧差法原理

帧差法的实现非常简单:

如图可见,由目标运动引起的运动变化区域包括运动目标在前后两帧中的共同位置(图中黑色区域)、在当前帧中新显露出的背景区域和新覆盖的背景区域三部分。

数学原理:

2.vivado HLS实现

Vivado HSL是xilinx公司推出的高层次综合工具,使用C/C++就能实现传统的verilog语言进行的开发,降低了开发难度,内置的hls视频库实现了基本的opencv函数,直接调用可以实现转换。

(1)打开HLS如下图

(2)创建新工程

(3)一直点击next,出现下图

(4)选择FPGA芯片类型 我的是7020-2

(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<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)继续右键source 选择new file 输入 top.h

#ifndef _TOP_H_

#define _TOP_H_

#include "hls_video.h"

//#include "ap_int.h"

//#include <math.h>

#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<MAX_HEIGHT, MAX_WIDTH, HLS_8UC3> RGB_IMAGE;

typedef hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC1> 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; i++) {

//获取图像数据

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了,我们下期再讲如何调用

本文分享自微信公众号 - FPGA开源工作室(leezym0317)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 盲盒就像巧克力,你永远不知道下一个能开出什么

    美国电影《阿甘正传》中,阿甘吃的巧克力是没有标志的,一盒分为12块或是24块,每一块都有不同的包装、形状、颜色、口味。只有拆开放在嘴里,品尝之后才能知晓个中滋味...

    翟菜花
  • 腾讯云云服务器如何搭建Discuz! 论坛

    CrossdayDiscuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统。自2001年6月面世以来,Di...

    用户6430810
  • 使用netstat命令验证DDOS入侵

    般来说,服务器非常慢可能原因是多方面的,有可能是配置错误,脚本错误或者是一些奇诡的硬件。当然也有可能是有人对你的服务器进行 Dos (拒绝服务攻击)或者 DDO...

    用户5807183
  • Sudomy:子域名枚举与分析工具

    Sudomy是一个使用bash脚本创建的子域枚举工具,用于快速全面地分析域和收集子域。

    FB客服
  • 邂逅二次元爱豆 | 波洞星战设定

    ? 腾讯ISUX isux.tencent.com 社交用户体验设计 ? ? ? 导语 在ACG圈有着这样一种赛事:没有硝烟战火,没有(广义上的)明星参与...

    腾讯ISUX
  • 虚拟IP(VIP)

       高可用性HA(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可...

    跟着阿笨一起玩NET
  • 如何更好地结构化表示一个 URL?

    相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSockets 库。这里回顾一下它们的基本用法,例如使用 Requests 库...

    用户1564362
  • DNS隧道流量分析

    DNS协议又称域名系统是互联网的基础设施,只要上网就会用到,因而DNS协议是提供网络服务的重要协议,在黑客进入内网后会使用DNS、ICMP、HTTP等协议隧道隐...

    FB客服
  • 腾讯云域名解析教程_腾讯云购买的域名如何解析IP地址

    在2019年建网站的步骤和过程一文里面,奶爸给大家说的建网站第一步就是注册域名,那么如果你是在腾讯云注册的域名,注册完毕后怎么解析到自己的网站服务器的IP地址呢...

    奶爸建站笔记
  • 哎,我早就料到你获取IP地址的姿势不对啦!

    来源:https://blog.csdn.net/takeurhand/article/details/52512200

    用户5224393

扫码关注云+社区

领取腾讯云代金券