在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

用Vitis HLS實現OpenCV仿真的方法

OpenFPGA ? 來源:OpenFPGA ? 2023-04-10 09:03 ? 次閱讀

這篇文章的基礎是《Windows上快速部署Vitis HLS OpenCV仿真》,我們使用的版本是Vitis HLS 2022.2,其他版本BUG不清楚,目前已知2021版本有BUG,只能使用其他方式,本文不適合。

這次選擇中值濾波這個常規算法作為演示算法。

算法原理

算法原理很簡單,我們先介紹均值濾波,因為線性濾波的基礎是均值濾波,中值濾波是在這個基礎上發展過來的。

均值濾波

圖像均值濾波是一種基本的圖像平滑處理方法,也被稱為“盒子濾波”或“平滑濾波”。它的主要思想是對圖像中的每個像素取一個局部均值,以降低圖像噪聲和細節對圖像邊緣檢測和其他計算機視覺算法的影響。

具體來說,圖像均值濾波涉及在圖像中移動一個固定尺寸的窗口,例如 的窗口。對于每個窗口,計算窗口內所有像素的平均值,并將該值分配給窗口中心的像素。這個過程將重復應用于整個圖像,用于生成平滑的輸出圖像。

在進行圖像處理時,一張圖片可以看做一個矩陣,假設有個6x6圖片,如下:

a0ef85ca-d73a-11ed-bfe3-dac502259ad0.png

處理內核如下:

a1019b52-d73a-11ed-bfe3-dac502259ad0.png

動畫演示處理過程如下

特點

具有非常不具代表性的值的單個像素會顯著影響其鄰域中所有像素的平均值。

濾波器鄰域跨越邊緣時,濾波器將為邊緣上的像素插入新值,從而模糊該邊緣。如果輸出中需要尖銳的邊緣,這可能是個問題。

這兩個問題都由中值濾波器解決,中值濾波器通常是比均值濾波器更好的降噪濾波器,但計算時間更長。

通常,均值濾波器充當低通頻率濾波器 ,因此減少了圖像中存在的空間強度導數。

上圖描繪了一個包含更廣泛不同空間頻率的場景。用 3×3 均值濾波器平滑一次后,我們得到

背景中的低空間頻率信息并未受到過濾的顯著影響,但前景對象的(曾經清晰的)邊緣已被明顯平滑。用 7×7 均值濾波器過濾后,得到下圖

將此結果與通過在原始圖像上傳遞 3×3 均值濾波器三次獲得的結果進行比較

上兩圖說明一個問題:對一幅圖像應用大窗口的濾波器和應用多次小窗口濾波器效果差不多。

常見變體

此處討論的均值平滑濾波器的變體包括:閾值平均,其中僅當其原始值與平均值之間的差大于預設閾值時才改變中心像素值的條件下應用平滑。這具有平滑噪聲的效果,圖像細節的損失較小。

其他不計算鄰域均值的卷積濾波器也經常用于平滑。其中最常見的一種是高斯平滑濾波器。

中值濾波

圖像中值濾波是一種常用的非線性濾波方法,也被稱為排序濾波器。它的主要原理是將圖像中每個像素周圍的像素排序,并將排序后的中間值作為該像素的輸出值。

中值濾波可以有效地抑制圖像中的噪聲,同時保留圖像中細節和邊緣信息。相對于其他線性濾波器(如均值濾波器),它可以在更好地去除噪聲的同時保留圖像的細節和邊緣上提供更好的性能。

a1bfd626-d73a-11ed-bfe3-dac502259ad0.png

具體地,對于每個像素,中值濾波器會包括 個鄰域像素,其中 和 是正奇數。它們將以該像素為中心構成一個矩形窗口或一個圓形窗口。

a1eb36b8-d73a-11ed-bfe3-dac502259ad0.png

窗口大小是中值濾波器的重要參數。在選擇窗口大小時,應該考慮噪聲的特性以及需要保留的圖像細節。通常情況下,窗口大小越大,中值濾波器能夠去除的噪聲越大,但也會導致圖像模糊。

然后,對于每個像素,將鄰域像素按灰度值進行排序,取排序后的中間值作為該像素的輸出值。這個輸出值將取代原始圖像中的像素值,從而產生一個平滑且噪聲減少的圖像。

中值濾波器的優點是它可以在去除噪聲的同時保留圖像中的邊緣和細節,但它的缺點是計算成本較高,并且可能導致圖像的細節丟失。此外,當噪聲水平很高時,這種濾波器可能無法完全去除噪聲。

所有平滑技術都可以有效去除信號平滑塊或平滑區域中的噪聲,但會對邊緣產生不利影響。通常,在降低信號噪聲的同時,保留邊緣也很重要。例如,邊緣對于圖像的視覺特性至關重要。對于小到中等水平的高斯噪聲,中值濾波器在去除噪聲方面明顯優于高斯濾波,同時為給定的固定窗口大小保留邊緣。然而,對于高水平的噪聲,它的性能并不比高斯模糊好多少,而對于散斑噪聲和椒鹽噪聲(脈沖噪聲),它特別有效。正因為如此,中值濾波在數字圖像處理中得到了非常廣泛的應用。

OpenCV實現

使用OpenCV進行算法驗證和Matlab進行算法驗證其實思路差不多,先驗證算法的效果再驗證算法的正確性,這一步使用OpenCV和MatLab一樣,我們就使用OpenCV進行驗證,這一步就不實際展開了,代碼如下:

//-----------------------------------【頭文件包含部分】---------------------------------------
//描述:包含程序所依賴的頭文件
//----------------------------------------------------------------------------------------------
#include"opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"

//-----------------------------------【命名空間聲明部分】---------------------------------------
//描述:包含程序所使用的命名空間
//-----------------------------------------------------------------------------------------------
usingnamespacecv;

//-----------------------------------【main()函數】--------------------------------------------
//描述:控制臺應用程序的入口函數,我們的程序從這里開始
//-----------------------------------------------------------------------------------------------
intmain()
{
//載入原圖
Matimage=imread("1.jpg");

//創建窗口
namedWindow("中值濾波【原圖】");
namedWindow("中值濾波【效果圖】");

//顯示原圖
imshow("中值濾波【原圖】",image);

//進行中值濾波操作
Matout;
medianBlur(image,out,7);

//顯示效果圖
imshow("中值濾波【效果圖】",out);

waitKey(0);
}

HLS加速和仿真

上面就完成了算法的介紹和論證,其中論證過程并沒有詳細介紹,因為本篇文章重點不是這個,后續在介紹這個算法的時候再詳細展開。

HLS工程搭建

新建工程

如下:

a22eb654-d73a-11ed-bfe3-dac502259ad0.png

第二頁和第三頁不用管,后續再進行設置

a2497868-d73a-11ed-bfe3-dac502259ad0.pnga2616310-d73a-11ed-bfe3-dac502259ad0.png

最后一頁,需要設置兩個地方,注意一個地方

a288066e-d73a-11ed-bfe3-dac502259ad0.png

其中,Uncertainty參數含義見下,默認不設置即可。

在UG1399的set_clock_uncertainty章節有詳細介紹。

【uncertainty】:以 ns 為單位指定,表示時鐘周期中有多少被用作余量。不確定性也可以指定為時鐘周期的百分比。默認的不確定性是時鐘周期的 27%。

也可以使用函數:

set_clock_uncertainty

【uncertainty】:以 ns 為單位指定,表示時鐘周期中有多少被用作余量。不確定性也可以指定為時鐘周期的百分比。默認的不確定性是時鐘周期的 27%。

【clock_list】:應用不確定性的時鐘列表。如果未提供,它將應用于所有時鐘。

添加源文件

新建xf_median_blur_accel.cpp

#include"xf_median_blur_config.h"

staticconstexprint__XF_DEPTH=(HEIGHT*WIDTH*(XF_PIXELWIDTH(TYPE,NPC1))/8)/(PTR_WIDTH/8);

voidmedian_blur_accel(ap_uint*img_in,introws,intcols,ap_uint*img_out){
//clang-formatoff
#pragmaHLSINTERFACEm_axiport=img_inoffset=slavebundle=gmem0depth=__XF_DEPTH
#pragmaHLSINTERFACEm_axiport=img_outoffset=slavebundle=gmem1depth=__XF_DEPTH
#pragmaHLSINTERFACEs_axiliteport=rowsbundle=control
#pragmaHLSINTERFACEs_axiliteport=colsbundle=control
#pragmaHLSINTERFACEs_axiliteport=returnbundle=control
//clang-formaton

xf::MatimgInput(rows,cols);
xf::MatimgOutput(rows,cols);

//clang-formatoff
#pragmaHLSDATAFLOW
//clang-formaton

//Retrievexf::Matobjectsfromimg_indata:
xf::Array2xfMat(img_in,imgInput);

//RunxfOpenCVkernel:
xf::medianBlur(
imgInput,imgOutput);

//Convert_dstxf::Matobjecttooutputarray:
xf::xfMat2Array(imgOutput,img_out);

return;
}//Endofkernel

添加仿真文件

新建xf_median_blur_tb.cpp

#include"common/xf_headers.hpp"
#include"xf_median_blur_config.h"

intmain(intargc,char**argv){
if(argc!=2){
fprintf(stderr,"Usage:%s",argv[0]);
returnEXIT_FAILURE;
}

cv::Matin_img,out_img,ocv_ref,diff;

//Readingintheimage:
#ifGRAY
in_img=cv::imread(argv[1],0);//readinginthegrayimage
#else
in_img=cv::imread(argv[1],1);//readinginthecolorimage
#endif

if(in_img.data==NULL){
fprintf(stderr,"ERROR:Cannotopenimage%s
",argv[1]);
returnEXIT_FAILURE;
}

//creatememoryforoutputimage
#ifGRAY
ocv_ref.create(in_img.rows,in_img.cols,CV_8UC1);
out_img.create(in_img.rows,in_img.cols,CV_8UC1);//creatememoryforoutputimage
diff.create(in_img.rows,in_img.cols,CV_8UC1);
#else
ocv_ref.create(in_img.rows,in_img.cols,CV_8UC3);
out_img.create(in_img.rows,in_img.cols,CV_8UC3);//creatememoryforoutputimage
diff.create(in_img.rows,in_img.cols,CV_8UC3);
#endif

//OpenCVreference:
cv::medianBlur(in_img,ocv_ref,WINDOW_SIZE);

//OpenCLsection:
#ifGRAY
size_timage_in_size_bytes=in_img.rows*in_img.cols*1*sizeof(unsignedchar);
#else
size_timage_in_size_bytes=in_img.rows*in_img.cols*3*sizeof(unsignedchar);
#endif
size_timage_out_size_bytes=image_in_size_bytes;

//Callthetopfunction
median_blur_accel((ap_uint*)in_img.data,in_img.rows,in_img.cols,(ap_uint*)out_img.data);

//Writedownoutputimages:
cv::imwrite("hls_out.jpg",out_img);//kerneloutput
cv::imwrite("ref_img.jpg",ocv_ref);//referenceimage

absdiff(ocv_ref,out_img,diff);
//Savethedifferenceimagefordebuggingpurpose:
cv::imwrite("error.png",diff);
floaterr_per;
xf::analyzeDiff(diff,10,err_per);
if(err_per>0.0f){
fprintf(stderr,"ERROR:TestFailed.
");
return1;
}else
std::cout<

設置仿真庫

在下面界面設置相關參數:

a2a4fc10-d73a-11ed-bfe3-dac502259ad0.png

在這個界面設置

a2ca8afc-d73a-11ed-bfe3-dac502259ad0.png

1、Top Function

設置主函數的,點擊Browse進行選擇即可。

2、設置設計文件Edit cflags,添加調用的設計頭文件

添加

-IE:/vitis_hls_image/Vitis_Libraries-2020.2/Vitis_Libraries-2020.2/vision/L1/include-std=c++0x-IH:/FILE/HLS/meanblur/src/build-I./.-D__SDSVHLS__-std=c++0x

3、設置設計文件Edit csimflags

-IE:/vitis_hls_image/Vitis_Libraries-2020.2/Vitis_Libraries-2020.2/vision/L1/include-std=c++0x-IH:/FILE/HLS/meanblur/src/build-I./.-D__SDSVHLS__-std=c++0x

接下來設置仿真庫路徑

a2ef1804-d73a-11ed-bfe3-dac502259ad0.png

1、設置仿真文件Edit cflags

-IE:/vitis_hls_image/opencv_lib/opencv/build_2/install/include-IE:/vitis_hls_image/Vitis_Libraries-2020.2/Vitis_Libraries-2020.2/vision/L1/include-IH:/FILE/HLS/meanblur/src/build-I.-std=c++0x-D__SDSVHLS__-std=c++0x

2、設置仿真文件Edit csimflags

-IE:/vitis_hls_image/opencv_lib/opencv/build_2/install/include-IE:/vitis_hls_image/Vitis_Libraries-2020.2/Vitis_Libraries-2020.2/vision/L1/include-IH:/FILE/HLS/meanblur/src/build-I.-std=c++0x-D__SDSVHLS__-std=c++0x

3、設置Linker Flags,調用OpenCV庫文件

-LE:/vitis_hls_image/opencv_lib/opencv/build_2/install/x64/mingw/lib-llibopencv_imgcodecs455-llibopencv_imgproc455-llibopencv_core455-llibopencv_highgui455-llibopencv_flann455-llibopencv_features2d455

4、 設置Input Arguments,這個是調用仿真圖片,可以后續再設置

H:/FILE/HLS/meanblur/src/128x128.png

綜合

點擊綜合按鈕即可開始綜合,結果如下:

a310e5f6-d73a-11ed-bfe3-dac502259ad0.png

仿真

點擊仿真按鈕得到下圖仿真結果

下圖從左到右分別為:OpenCV處理的結果、HLS處理的結果以及最后的兩個圖像差(無差別即全黑)。

聯合仿真

點擊聯合仿真按鈕后等待仿真結束,然后點擊下面按鈕查看波形:

a3746ff4-d73a-11ed-bfe3-dac502259ad0.pnga38dba7c-d73a-11ed-bfe3-dac502259ad0.png

導出IP

點擊導出IP按鈕等待導出即可。

總結

今天的例程演示完畢,從建立工程到最后導出IP,基本比較詳細。但是,上面的例程是不能直接應用到視頻里的,原因是上面的接口沒經過改動,需要從AXI轉成AXI-STREAM接口后再再接入到視頻架構中即可,這部分我們后續再詳細說明。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 濾波器
    +關注

    關注

    161

    文章

    7876

    瀏覽量

    179066
  • 計算機視覺
    +關注

    關注

    8

    文章

    1701

    瀏覽量

    46148
  • OpenCV
    +關注

    關注

    31

    文章

    635

    瀏覽量

    41595
  • HLS
    HLS
    +關注

    關注

    1

    文章

    130

    瀏覽量

    24217

原文標題:如何用 Vitis HLS 實現 OpenCV 仿真

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    新手求助,HLS實現opencv算法加速的IP在vivado的使用

    我照著xapp1167文檔,HLS實現fast_corners的opencv算法,并生成IP。然后想把這個算法塞到第三季的CH05_AXI_DMA_OV5640_HDMI上,這個de
    發表于 01-16 09:22

    Vivado HLS實現OpenCV圖像處理的設計流程與分析

    像素訪問對應方法2.3 HLS實現OpenCV應用的實例(快速角點濾波器image_filter)我們通過快速角點的例子,說明通常用Viv
    發表于 07-08 08:30

    FPGA高層次綜合HLSVitis HLS知識庫簡析

    ,Vivado 2019.1之前(包括),HLS工具叫Vivado HLS,之后為了統一將HLS集成到Vitis里了,集成之后增加了一些功能,同時將這部分開源出來了。
    發表于 09-07 15:21

    使用Vitis HLS創建屬于自己的IP相關資料分享

    1、使用Vitis HLS創建屬于自己的IP高層次綜合(High-level Synthesis)簡稱HLS,指的是將高層次語言描述的邏輯結構,自動轉換成低抽象級語言描述的電路模型的過程。對于AMD
    發表于 09-09 16:45

    利用Vitis HLS tcl shell一鍵跑通視覺加速例程

    高層次綜合工具中調用視覺庫遇到的大多數問題都和 opencv 庫以及Xilinx Vision 庫的安裝路徑有關,如今 Vitis HLS 2020.1 之后的版本都不再提供OpenCV
    的頭像 發表于 12-29 11:12 ?3519次閱讀
    利用<b class='flag-5'>Vitis</b> <b class='flag-5'>HLS</b> tcl shell一鍵跑通視覺加速例程

    Vitis Vision | 利用Vitis HLS tcl shell 一鍵跑通視覺加速例程

    在論壇上遇到在高層次綜合工具中調用視覺庫遇到的大多數問題都和 opencv 庫以及Xilinx Vision 庫的安裝路徑有關,如今 Vitis HLS 2020.1 之后的版本都不再提供
    發表于 01-27 06:17 ?6次下載
    <b class='flag-5'>Vitis</b> Vision | 利用<b class='flag-5'>Vitis</b> <b class='flag-5'>HLS</b> tcl shell 一鍵跑通視覺加速例程

    基于Vitis HLS的加速圖像處理

    使用Vivado / Vitis工具提供預安裝的OpenCV版本。盡管Vitis_hls編譯Vision庫不需要OpenCV,但是用戶測試驗證使用時
    的頭像 發表于 02-16 16:21 ?2540次閱讀
    基于<b class='flag-5'>Vitis</b> <b class='flag-5'>HLS</b>的加速圖像處理

    Vitis HLS工具簡介及設計流程

    Vitis HLS 是一種高層次綜合工具,支持將 C、C++ 和 OpenCL 函數硬連線到器件邏輯互連結構和 RAM/DSP 塊上。Vitis HLS 可在
    的頭像 發表于 05-25 09:43 ?2466次閱讀

    Vitis HLS如何添加HLS導出的.xo文件

    HLS導出的.xo文件如何導入到Vitis里面?需要把.xo文件解壓,然后把文件夾導入到Vitis Kernel/src文件夾下嗎?
    的頭像 發表于 08-03 11:20 ?3162次閱讀
    <b class='flag-5'>Vitis</b> <b class='flag-5'>HLS</b>如何添加<b class='flag-5'>HLS</b>導出的.xo文件

    Vitis HLS前端現已全面開源

    Vitis HLS 工具能夠將 C++ 和 OpenCL 功能部署到器件的邏輯結構和 RAM/DSP 塊上。在 GitHub 上提供 Vitis HLS 前端為研究人員、開發人員和編譯
    的頭像 發表于 08-03 09:53 ?1005次閱讀

    Vitis HLS知識庫總結

    對于AMD Xilinx而言,Vivado 2019.1之前(包括),HLS工具叫Vivado HLS,之后為了統一將HLS集成到Vitis里了,集成之后增加了一些功能,同時將這部分開
    的頭像 發表于 09-02 09:06 ?3616次閱讀

    理解Vitis HLS默認行為

    相比于VivadoHLS,Vitis HLS更加智能化,這體現在Vitis HLS可以自動探測C/C++代碼中可并行執行地部分而無需人工干預添加pragma。另一方面VitisHLS也
    的頭像 發表于 11-24 11:42 ?1913次閱讀

    AMD全新Vitis HLS資源現已推出

    AMD Vitis HLS 工具允許用戶通過將 C/C++ 函數綜合成 RTL,輕松創建復雜的 FPGA 算法。Vitis HLS 工具與 Vivado Design Suite(用于
    的頭像 發表于 04-23 10:41 ?1183次閱讀
    AMD全新<b class='flag-5'>Vitis</b> <b class='flag-5'>HLS</b>資源現已推出

    如何在Vitis HLS GUI中使用庫函數?

    Vitis? HLS 2023.1 支持新的 L1 庫向導,本文將講解如何下載 L1 庫、查看所有可用功能以及如何在 Vitis HLS GUI 中使用庫函數。
    的頭像 發表于 08-16 10:26 ?1271次閱讀
    如何在<b class='flag-5'>Vitis</b> <b class='flag-5'>HLS</b> GUI中使用庫函數?

    Vitis HLS移植指南

    電子發燒友網站提供《Vitis HLS移植指南.pdf》資料免費下載
    發表于 09-13 09:21 ?0次下載
    <b class='flag-5'>Vitis</b> <b class='flag-5'>HLS</b>移植指南
    主站蜘蛛池模板: 巨乳色网址| 四虎hu | 国产色系视频在线观看免费 | 国产色婷婷精品综合在线 | 六月色婷婷 | 亚洲综合色色图 | 窝窝午夜视频 | 日本四虎影院 | 天天摸天天操天天干 | 在线观看高清免费播放 | 一级特黄aa大片免费 | 日韩精品午夜 | 边做边爱在线观看视频免费 | 色吧在线视频 | 97一区二区三区 | 中日韩精品视频在线观看 | 毛片大全免费 | 激激婷婷综合五 | 天天狠天天干 | 色偷偷免费 | 九九99视频在线观看视频观看 | 高清色视频 | 免费视频久久看 | 天天摸夜夜摸夜夜狠狠摸 | 日韩毛片免费线上观看 | 日韩欧美视频在线一区二区 | 日b毛片 | 狠狠干免费视频 | 国产精品免费拍拍1000部 | 色多多网站在线观看 | 日本免费观看完整视频 | 丰满寡妇一级毛片 | 中文字幕v视界影院 | 亚洲精品午夜久久aaa级久久久 | 日本黄色免费网站 | 欧美日韩国产成人高清视频 | 国产农村乱色xxxx | 免费看黄视频 | 国内精品久久久久影 | 日本黄页网站在线观看 | 欧美色欧美亚洲高清在线视频 |