当前位置: 首页 > news >正文

Vitis Accelerated Libraries 学习笔记--OpenCV 运行测试

目录

1. 简介

2. 实例测试

2.1 实例介绍

2.2 创建工程

2.2.1 创建工程

2.2.2 获取路径

2.2.3 设置路径

2.2.4 打开工程

2.2.5 添加文件 

2.2.6 启动 GUI

2.2.7 配置 csim 参数

3 常见错误

3.1 核心共享库报错

4. 总结


1. 简介

在《Vitis Accelerated Libraries 学习笔记--OpenCV 安装指南-CSDN博客》一文中,我详尽地介绍了 OpenCV 的安装过程。尽管 Vitis Vision 库的实现本身并不依赖于 OpenCV,但要运行库中的示例设计,OpenCV 是必需的。此外,在用户的测试平台上验证算法时,也可能会用到 OpenCV。在本文中,我们将深入探讨如何有效地利用 OpenCV 库来执行测试,确保您的设计能够在实际环境中达到预期的性能。

本文基于你了解 OpenCV 库的基本功能和它在图像处理和计算机视觉中的应用,然后,我会详细说明如何将 OpenCV 集成到 Vitis Vision 库的工作流中,以及如何使用 OpenCV 提供的函数来创建测试用例和验证设计。

2. 实例测试

2.1 实例介绍

以 Vitis Vision Library 中的 resize 内核为例,它的主要功能是执行图像的缩放操作。在 Vitis_Libraries/vision/L1/tests/resize/ 目录下,你会发现一系列文件夹,这些文件夹代表了不同的测试用例,用于验证和展示 resize 内核的功能:

  • resize_NPPC1_8UC1_8UC1_AREA
  • resize_NPPC1_8UC1_8UC1_BILINEAR
  • resize_NPPC1_8UC1_8UC1_NN
  • resize_NPPC1_8UC3_8UC3_AREA
  • resize_NPPC1_8UC3_8UC3_BILINEAR
  • resize_NPPC1_8UC3_8UC3_NN
  • resize_NPPC8_8UC1_8UC1_AREA
  • resize_NPPC8_8UC1_8UC1_BILINEAR
  • resize_NPPC8_8UC1_8UC1_NN
  • resize_NPPC8_8UC3_8UC3_AREA
  • resize_NPPC8_8UC3_8UC3_BILINEAR
  • resize_NPPC8_8UC3_8UC3_NN

我们先来了解一下这些文件夹的命名含义:

  • NPPC1 或 NPPC8: 这代表每个像素时钟周期(Number of Pixels Per Clock)的数量。NPPC1 表示每个时钟周期处理一个像素,而 NPPC8 表示每个时钟周期处理八个像素。
  • 8UC1 或 8UC3: 这指的是图像的类型。8UC1 表示 8 位无符号单通道图像,而 8UC3 表示 8 位无符号三通道图像。
  • AREA, BILINEAR, NN: 这些是 resize 函数使用的不同插值方法。AREA 是面积插值,BILINEAR 是双线性插值,NN 是最近邻插值。

最近邻插值(Nearest Neighbor, NN): 这是最简单的插值方法。它选择最接近目标位置的源像素值来填充目标像素。这种方法的计算速度快,但可能会导致图像在放大时出现块状效果。
双线性插值(Bilinear): 双线性插值考虑了最近的四个像素点,并基于它们的距离,计算加权平均值来确定新像素的值。这种方法比最近邻插值平滑,但在某些情况下可能会引入模糊。
面积插值(Area): 面积插值是一种更复杂的方法,它考虑了源图像中多个像素的区域,并计算这些像素的平均值来确定目标像素的值。这种方法在缩小图像时特别有用,因为它可以减少混叠效应,通常能得到更平滑的结果。

每种方法都有其优点和适用场景。最近邻插值适合对计算速度要求高的场合,双线性插值在保持图像细节的同时提供了平滑的效果,而面积插值则在减少图像缩小时的失真方面表现出色。选择哪种插值方法取决于具体的应用需求和预期的图像质量。

2.2 创建工程

通过 cmd 和 GUI 混合操作(实操下来,这个方法最容易理解)。

2.2.1 创建工程

cd /home/dong/Documents/test/resize
source /opt/Xilinx/Vitis_HLS/2022.1/settings64.sh
vitis_hls -gui # 在GUI中创建空白工程

通过命令行打开 Vitis HLS 界面,因为之后的操作步骤要退出 GUI 回到命令行。 

参考如下路径:

 

创建成功后,工程目录结构如下:

resize/├── resize_kernel/│      ├── solution1/│      └── hls.app└── vitis_hls.log

创建命令后,即可退出 GUI,回到 bash shell。 

2.2.2 获取路径

在 bash shell 中,通过 bash 命令获得如下3个路径。

1. XF_PROJ_ROOT 路径

XF_PROJ_ROOT 目录为 Vison 库的参考目录,在 vision 目录下运行 pwd 命令获得。

“/home/dong/Documents/vision”。

2. OPENCV_INCLUDE 路径

OPENCV_INCLUDE 是用来设置 OpenCV 头文件的路径。当你编译使用OpenCV的程序时,编译器会在这个路径下查找所需的头文件。可运行如下命令获得:

pkg-config --cflags opencv4 | sed 's/-I//g'

“/usr/local/include/opencv4” 。

 

3. OPENCV_LIB 目录

OPENCV_LIB 是用来设置OpenCV库文件的路径。在链接程序时,链接器会在这个路径下查找OpenCV的库文件。 可运行如下命令获得:

pkg-config --libs-only-L opencv4  | sed 's/-L//g'

“/usr/local/lib ”。

2.2.3 设置路径

进入 vitis_hls -i 赋值如下内容,三行分开复制并执行。

set XF_PROJ_ROOT /home/dong/Documents/vision
set OPENCV_INCLUDE /usr/local/include/opencv4
set OPENCV_LIB /usr/local/lib

clear,清除窗口内容。

2.2.4 打开工程

继续在命令模式中:

cd resize
open_project -reset NAME

其中,NAME 为工程名称,此例中,工程名称为 resize_kernel。

resize/├── resize_kernel/│      ├── solution1/│      └── hls.app└── vitis_hls.log

-reset:移除工程内已存在的所有数据,即将工程复位。每条新的 add_files 命令都会向现有
工程添加更多文件,多次添加同一个文件,可能引起错乱。

get_project -name,可查看是否打开工程。

 

2.2.5 添加文件 

在 <vitis lib>/vision/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA 目录下,找到 run_hls.tcl 命令,找到 add_files 命令对应的行,添加文件。

1. 加速器的实现代码文件:

add_files "${XF_PROJ_ROOT}/L1/examples/resize/xf_resize_accel.cpp" -cflags " -I ${XF_PROJ_ROOT}/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I${XF_PROJ_ROOT}/L1/include -I ./ -D__SDSVHLS__ -std=c++0x" -csimflags " -I ${XF_PROJ_ROOT}/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I${XF_PROJ_ROOT}/L1/include -I ./ -D__SDSVHLS__ -std=c++0x"

添加成功后,显示:

INFO: [HLS 200-10] Adding design file '/home/dong/Documents/Vitis_Libraries-main/vision/L1/examples/resize/xf_resize_accel.cpp' to the project

2.  测试平台文件:

add_files -tb "${XF_PROJ_ROOT}/L1/examples/resize/xf_resize_tb.cpp" -cflags " -I ${XF_PROJ_ROOT}/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I${OPENCV_INCLUDE} -I${XF_PROJ_ROOT}/L1/include -I ./ -D__SDSVHLS__ -std=c++0x" -csimflags " -I ${XF_PROJ_ROOT}/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I${XF_PROJ_ROOT}/L1/include -I ./ -D__SDSVHLS__ -std=c++0x"

添加成功后,显示:

INFO: [HLS 200-10] Adding test bench file '/home/dong/Documents/Vitis_Libraries-main/vision/L1/examples/resize/xf_resize_tb.cpp' to the project

3. 设置 Top

找到 set_top 命令对应的行:

set_top resize_accel

2.2.6 启动 GUI

vitis_hls -p NAME

 -p:在 IDE 模式下打开现有工程。

在 script.tcl 目录中,可以看到之前的配置已经生效:

open_project resize_kernel
set_top resize_accel
add_files ../../Vitis_Libraries_main/vision/L1/examples/resize/xf_resize_accel.cpp -cflags "-I/home/dong/Documents/Vitis_Libraries_main/vision/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I/home/dong/Documents/Vitis_Libraries_main/vision/L1/include -I./. -D__SDSVHLS__ -std=c++0x" -csimflags "-I/home/dong/Documents/Vitis_Libraries_main/vision/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I/home/dong/Documents/Vitis_Libraries_main/vision/L1/include -I./. -D__SDSVHLS__ -std=c++0x"
add_files -tb ../../Vitis_Libraries_main/vision/L1/examples/resize/xf_resize_tb.cpp -cflags "-I/home/dong/Documents/Vitis_Libraries_main/vision/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I/usr/local/include/opencv4 -I/home/dong/Documents/Vitis_Libraries_main/vision/L1/include -I. -D__SDSVHLS__ -std=c++0x -Wno-unknown-pragmas" -csimflags "-I/home/dong/Documents/Vitis_Libraries_main/vision/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I/home/dong/Documents/Vitis_Libraries_main/vision/L1/include -I. -D__SDSVHLS__ -std=c++0x -Wno-unknown-pragmas"
open_solution "solution1" -flow_target vivado
set_part {xck26-sfvc784-2LV-c}
create_clock -period 10 -name default
#source "./resize_kernel/solution1/directives.tcl"
csim_design
csynth_design
cosim_design
export_design -format ip_catalog

2.2.7 配置 csim 参数

在示例目录下,找到 csim_design 命令对应的行,配置参数。

if {$CSIM == 1} {csim_design -ldflags "-L ${OPENCV_LIB} -lopencv_imgcodecs -lopencv_imgproc -lopencv_core -lopencv_highgui -lopencv_flann -lopencv_features2d" -argv "  ${XF_PROJ_ROOT}/data/128x128.png"
}

3 常见错误

3.1 核心共享库报错

/xx/xx/.../: error while loading shared libraries: libopencv_imgcodecs.so.4.4: cannot open shared object file: No such file or directory

意味着程序无法找到OpenCV的核心共享库文件。

解决办法:

使用以下命令行查找包含共享库 libopencv_imgcodecs.so.4.4 的文件夹:

sudo find / -name "libopencv_imgcodecs.so.4.4"

创建一个名为 /etc/ld.so.conf.d/opencv.conf 的文件,并向其中写入存储二进制文件的文件夹的路径。例如,我将 /usr/local/lib/ 写入我的 opencv.conf 文件。按如下方式运行命令行:

sudo ldconfig -v

 

4. 总结

在本系列学习笔记中,我们探讨了 Vitis Accelerated Libraries 和 OpenCV 的结合使用,强调了 OpenCV 在运行 Vitis Vision 库示例设计和验证用户测试平台算法中的重要性。通过详细的安装指南和实例测试,我们展示了如何将 OpenCV 集成到 Vitis Vision 库的工作流中,并利用其强大的函数库来创建和验证测试用例。

我们还讨论了如何解决常见的错误,例如找不到 OpenCV 核心共享库文件的问题,确保开发环境的顺利设置。通过这些步骤,使我们的工程设计在实际环境中能够达到预期的性能,同时也能够更好地理解和利用 Vitis Vision 库和 OpenCV 的强大功能。

相关文章:

Vitis Accelerated Libraries 学习笔记--OpenCV 运行测试

目录 1. 简介 2. 实例测试 2.1 实例介绍 2.2 创建工程 2.2.1 创建工程 2.2.2 获取路径 2.2.3 设置路径 2.2.4 打开工程 2.2.5 添加文件 2.2.6 启动 GUI 2.2.7 配置 csim 参数 3 常见错误 3.1 核心共享库报错 4. 总结 1. 简介 在《Vitis Accelerated Libraries …...

加固三防平板如何提高轨道交通系统的运营效率?

在当今快节奏的社会中&#xff0c;轨道交通系统作为城市交通的重要组成部分&#xff0c;其运营效率的提升对于缓解交通拥堵、满足人们的出行需求以及促进城市的发展具有至关重要的意义。而加固三防平板作为一种先进的技术设备&#xff0c;正逐渐在轨道交通领域发挥着关键作用&a…...

Django 靓号管理系统:实现登录功能

本文将详细介绍如何在 Django 靓号管理系统中实现登录功能,包括用户认证、验证码生成、以及中间件的使用。我们将逐步展示所有相关代码,并附带详细注释。 1. 项目结构 首先,让我们看一下项目的基本结构: number ├── manage.py ├── monaco.ttf ├── number │ …...

【Solr 学习笔记】Solr 源码启动教程

Solr 源码启动教程 本教程记录了如何通过 IDEA 启动并调试 Solr 源码&#xff0c;从 Solr9 开始 Solr 项目已由 ant 方式改成了 gradle 构建方式&#xff0c;本教程将以 Solr 9 为例进行演示&#xff0c;IDE 选择使用 IntelliJ IDEA。 Solr github 地址&#xff1a;https://gi…...

Java中的事件驱动编程模型

Java中的事件驱动编程模型 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我将为大家介绍Java中的事件驱动编程模型。事件驱动编程模型是一种以事件为核心驱…...

Python 语法基础一

1.变量 python 中变量很简单&#xff0c;不需要指定数据类型&#xff0c;直接使用等号定义就好。python变量里面存的是内存地址&#xff0c;也就是这个值存在内存里面的哪个地方&#xff0c;如果再把这个变量赋值给另一个变量&#xff0c;新的变量通过之前那个变量知道那个变量…...

从零开始:Spring Boot 中使用 Drools 规则引擎的完整指南

规则引擎作用 规则引擎主要用于将业务逻辑从应用程序代码中分离出来&#xff0c;提高系统的灵活性和可维护性。规则引擎通过预定义的规则来处理输入数据并做出相应的决策&#xff0c;从而实现业务逻辑的自动化和动态调整。 例如 门店信息校验&#xff1a;美团点评在门店信息…...

工业边缘计算网关

1 介绍 HINETG系列边缘计算网关&#xff08;Linux操作系统&#xff09;&#xff0c;是华辰智通的—款面向工业现场设备接入、数据采集、设备监控的工业级边缘计算网关。采用ARM Cortex-A7 800MHz高性能CPU,拥有以太网、串口、CAN口、IO口等丰富的接口&#xff0c;支持以太网、…...

【C++ 初阶路】--- 类和对象(末)

目录 一、const成员1.1 取地址及const取地址操作符重载 二、再谈构造函数2.1 构造函数体赋值2.2 初始化列表2.3 explicit关键字 三、static成员3.1 概念3.2 特性 四、友元4.1 友元函数4.2 友元类 五、内部类六、匿名对象 一、const成员 将const修饰的“成员函数”称之为const成…...

bable 【实用教程】

简介 bable 用于将 ES6 的语法编译为 ES5 只关心语法&#xff0c;不关心 API 是否正确。不处理模块化&#xff08;webpack 会处理&#xff09; 搭建开发环境 安装相关的包 npm i babel/cli babel/core babel/preset-env新建文件 .babelrc&#xff0c;内容为 { "presets…...

Android中使用startActivityForResult启动活动

Android中使用startActivityForResult启动活动 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在本文中&#xff0c;我们将深入探讨Android开发中使用startActi…...

NineData和华为云在一起!提供一站式智能数据库DevOps平台

以GuassDB数据库为底座 NineData和华为云一起 为企业提供 一站式智能数据库DevOps平台 帮助开发者 高效、安全地完成 数据库SQL审核 访问控制、敏感数据保护等 日常数据库相关开发任务 NineData 智能数据管理平台 NineData 作为新一代的云原生智能数据管理平台&#xf…...

深入解析 Redisson分布式锁看门狗机制

一、Redisson分布式锁概述 1.1 分布式锁的意义 在分布式系统中&#xff0c;多个节点可能同时访问共享资源&#xff0c;导致数据不一致或竞态条件。分布式锁通过协调不同节点对共享资源的访问&#xff0c;确保数据的一致性和并发访问的安全性。 1.2 Redisson分布式锁的优势 …...

Apache Arrow 和数据的未来:开放标准推动人工智能发展

Apache Arrow 是一种开源列式内存格式&#xff0c;适用于平面数据和分层数据。在现代数据湖中&#xff0c;开放数据格式&#xff08;如 Apache Arrow&#xff09;位于现代对象存储的存储层中。这些格式成为对象存储中的对象。 在最新版本中&#xff0c;Apache Arrow 宣布计划从…...

Vue项目生产环境的打包优化

Vue项目生产环境的打包优化 前言 在这篇文章我们讨论Vue项目生产环境的打包优化&#xff0c;并按步骤展示实际优化过程中的修改和前后对比。 背景 刚开始的打包体积为48.71M 优化 步骤一&#xff1a;删除viser-vue viser-vue底层依赖antv/g2等库一并被删除&#xff0c;…...

oracle数据库之使用Java程序调用存储过程(二十四)

在Oracle数据库中&#xff0c;你可以使用Java程序来调用存储过程。这通常涉及几个步骤&#xff1a;首先&#xff0c;确保你的Java环境能够连接到Oracle数据库&#xff1b;其次&#xff0c;使用JDBC&#xff08;Java Database Connectivity&#xff09;来调用存储过程。 以下是…...

西电953总分第一、专业课第一考研上岸

今年上岸西电杭研院网信院网络与信息安全专业&#xff0c;总分370分&#xff0c;专业课116分&#xff0c;分别是总分第一名&#xff0c;专业课第一名&#xff0c;感谢研梦的953叶学姐&#xff0c;非常负责&#xff0c;本硕大佬学姐&#xff0c;当年密码学38分选手&#xff08;满…...

pytorch-模型训练

目录 1. 模型训练的基本步骤1.1 train、test数据下载1.2 train、test数据加载1.3 Lenet5实例化、初始化loss函数、初始化优化器1.4 开始train和test 2. 完整代码 1. 模型训练的基本步骤 以cifar10和Lenet5为例 1.1 train、test数据下载 使用torchvision中的datasets可以方便…...

Linux /proc目录总结

1、概念 在Linux系统中&#xff0c;/proc目录是一个特殊的文件系统&#xff0c;通常被称为"proc文件系统"或"procfs"。这个文件系统以文件系统的方式为内核与进程之间的通信提供了一个接口。/proc目录中的文件大多数都提供了关于系统状态的信息&#xff0…...

【JavaEE】浅谈线程(二)

线程 线程的常见属性 线程属性可以通过下面的表格查看。 •ID 是线程的唯⼀标识&#xff0c;不同线程不会重复 • 名称是各种调试⼯具⽤到&#xff08;如jconsoloe&#xff09; • 状态表示线程当前所处的⼀个情况&#xff0c;下⾯我们会进⼀步说明 • 优先级高的线程理论上来…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...

react更新页面数据,操作页面,双向数据绑定

// 路由不是组件的直接跳转use client&#xff0c;useEffect&#xff0c;useRouter&#xff0c;需3个结合&#xff0c; use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...

MySQL基本操作(续)

第3章&#xff1a;MySQL基本操作&#xff08;续&#xff09; 3.3 表操作 表是关系型数据库中存储数据的基本结构&#xff0c;由行和列组成。在MySQL中&#xff0c;表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...

十二、【ESP32全栈开发指南: IDF开发环境下cJSON使用】

一、JSON简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;具有以下核心特性&#xff1a; 完全独立于编程语言的文本格式易于人阅读和编写易于机器解析和生成基于ECMAScript标准子集 1.1 JSON语法规则 {"name"…...