VitisHLS中读写任意深度的图像文件

一、8bits灰度图像的读写

        这里可以使用opencv的库函数,也可以使用赛灵思提供的库函数。实际上,赛灵思的 vision库也是调用opencv的imread和imwrite库函数的,只不过封装了一下而已。

#include <iostream>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv/cv.h>
#include <opencv2/highgui.hpp>
#include <opencv/cxcore.h>
#include <opencv2/imgproc.hpp>#include "common/xf_sw_utils.hpp"//512x512图像
int main(int argc, char* argv[])
{//8bits深度的图像读写//方式一: opencv库函数读写图像cv::Mat opencv_image_in;opencv_image_in = cv::imread(argv[1],cv::IMREAD_GRAYSCALE);//按照GRAY图读取图像cv::imwrite("opencv_image_in.tif",opencv_image_in);//显示//方式二: HLS库函数读写图像xf::cv::Mat<XF_8UC1, 512, 512, XF_NPPC1> HLS_image_in;HLS_image_in = xf::cv::imread<XF_8UC1, 512, 512, XF_NPPC1>(argv[1],cv::IMREAD_GRAYSCALE);//按照GRAY图读取图像xf::cv::imwrite<XF_8UC1, 512, 512, XF_NPPC1>("HLS_image_in.tif",HLS_image_in);//显示cv::waitKey(0);/// 等待用户按任意按键退出程序return 0;
}

        上面两种方式实现的读写文件的效果是一致的,赛灵思vision库的imread和imwrite额外增加了部分模板函数的内容。最终保存的图像文件也是一模一样的,这里就不粘贴图片结果了。

         至于8UC3的彩色图像,实测发现输出结果异常,应该是xf::cv::imwrite内部的图像类型有问题,因为我的工程中用不到,暂时不深究了。

 二、16bits灰度图像的读写

         对于opencv来说,直接读写16bits深度的图像没有任何问题。

        但是可能赛灵思的vision库做的还不够完善吧,我的vitisHLS2023.1,直接使用xf::cv::imread和xf::cv::imwrite读写,会出现问题,无法正常保存图像文件。

        在不修改库函数的情况下,本文中使用opencv库函数来读写图像与xf::cv::Mat之间的转化,主要是通过cv::Mat和赛灵思xf::cv::Mat两种不同类型的数据之间相互转化实现(主要目的是,当需要查看赛灵思自带库函数的图像处理结果时,可以方便输出中间结果。当然了,重新编写顶层文件,然后再testbench中调用顶层函数,输出结果也是一样的。)。

        具体可以参考代码:


#include <iostream>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv/cv.h>
#include <opencv2/highgui.hpp>
#include <opencv/cxcore.h>
#include <opencv2/imgproc.hpp>#include "common/xf_sw_utils.hpp"//512x512图像
int main(int argc, char* argv[])
{//16bits深度的图像读写//方式一: opencv库函数读写图像cv::Mat opencv_image_in;opencv_image_in = cv::imread(argv[1],cv::IMREAD_ANYDEPTH);//按照GRAY图读取图像cv::imwrite("opencv_image_in.tif",opencv_image_in);//显示//方式二: HLS库函数读写图像//利用opencv读取的图像经过转换,转化为xf::cv::Mat的形式,然后再调用赛灵思自带库函数进行处理xf::cv::Mat<XF_16UC1, 512, 512, XF_NPPC1> HLS_image_in;for(int r = 0; r < 512; r++ ){for(int c = 0; c < 512; c++ ){unsigned short tmp =  opencv_image_in.at<unsigned short>(r,c);//printf("%d\n",tmp);HLS_image_in.write(r*512 + c,tmp);}}//赛灵思自带库函数(比如二值化)处理HLS_image_in,得到HLS_image_out,本文只演示,不进行实际处理。//然后就可以将HLS_image_out导出为opencv格式,写入到图像文件cv::Mat hls_out_mat;hls_out_mat.create(512, 512,CV_16UC1);for(int r = 0; r < 512; r++ ){for(int c = 0; c < 512; c++ ){unsigned short tmp =  HLS_image_in.read(r*512 + c);hls_out_mat.at<unsigned short>(r,c) = tmp;}}cv::imwrite("hls_out_mat.tif",hls_out_mat);//cv::waitKey(0);/// 等待用户按任意按键退出程序return 0;
}

         代码中的核心思想是:不管是cv::Mat还是xf::cv::Mat类型的图像,只要他们的图像深度是16bits,那么他们的像素数据类型都是unsigned short,那么我们就可以一个像素一个像素的赋值,从而实现图像数据搬移,从而实现opencv和vitis库之间的不同图像格式的转换。

        同样的,32bits等不同深度的图像也都可以这样转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3-cookbook-字典的运算

第一章:数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典。大多数情况下使用这些数据结构是很简单的。但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题。 因此,这一章的目的就是讨论这些比较常见的问题和算法。 另外,我们也会…

R语言【taxlist】——clean_strings():清理字符串

Package taxlist version 0.2.4 Description 多个前导的和后随的空格以及错误的编码可能会在处理分类学名称的信息中导致严重的问题。clean_strings() 方法可以清除这些错误。 Usage clean_strings(x, ...)## S4 method for signature character clean_strings(x, from &quo…

Vue的状态管理Vuex

文章目录 一、介绍二、install三、store1、介绍2、创建并全局引入3、单一状态树4、多模块状态树(无命名空间)5、多模块状态树(有命名空间)一、介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库当我们的应用遇到多个组件共享状态(共享状态:多个组件维护1个变…

Docker安装RcoketMQ

1、Docker安装RcoketMQ-4.9.4 在同级文件夹创建目录config&#xff0c;并在里面创建文件broker.conf&#xff0c;文件内容如下&#xff1a; brokerClusterNameDefaultCluster brokerNamebroker-a brokerId0 deleteWhen04 fileReservedTime48 brokerRoleASYNC_MASTER flushDis…

linux系统ansible主机清单和命令

ansible主机清单和命令 主机清单配置主机清单文件配置主机清单方式常用变量 ansible命令ansible-doc命令ansible命令格式ansible配置公私钥ansible 命令集 主机清单 配置主机清单文件 /etc/ansible/hosts //配置主机清单文件配置主机清单方式 ip地址 ansible_ssh_user…

Python网络爬虫实战——实验5:Python爬虫之selenium动态数据采集实战

【实验内容】 本实验主要介绍和使用selenium库在js动态加载网页中数据采集的作用。 【实验目的】 1、理解动态加载网页的概念 2、学习Selenium库基本使用 3、掌握动态加载数据采集流程 【实验步骤】 步骤1理解动态加载网页 步骤2学习使用Selenium库 步骤3 采集河北政府采购…

Python初学者学习记录——python基础综合案例:数据可视化——地图可视化

一、基础地图使用 1、基础地图演示 2、基础地图演示——视觉映射器 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京市", 99),("上海市", 199),("湖南省", 2…

1 月 28日算法练习-前缀和

小郑的蓝桥平衡串 思路&#xff1a;把 L 看成 1&#xff0c;Q 看成 -1&#xff0c;利用前缀和来得到输入串的前缀子串中LQ 的和&#xff0c;利用前缀和差的性质得到子串&#xff0c;通过枚举看它是否平衡。 将L看做1&#xff0c;Q看做&#xff0d;1&#xff0c;只有当某个区间…

如何快速上手一个vue框架

安装nvm 下载nvm-setup.zip&#xff1a; https://github.com/coreybutler/nvm-windows/releases 解压安装nvm&#xff1a; 创建两个文件夹&#xff0c;一个是nvm的安装位置&#xff0c;另一个是node.js的下载位置。不需要配置环境变量和修改setting文件了 检查nvm是否安装成功…

不常见知识点汇总

目录 1.关于输入流&#xff08;cin&#xff09;1.1 cin.fail()1.2 cin.clear()1.3 cin.ignore() 随时补充&#xff01;&#xff01;&#xff01; 1.关于输入流&#xff08;cin&#xff09; 问题描述&#xff1a; int input 0; cin >> input; while (cin.fail()) {cin.…

Linux 增加 SWAP 空间

一、需求 通过阿里云启动项目时&#xff0c;使用Vuepress build编译静态页面时内存需要800MB&#xff0c;导致内存不够&#xff0c;因此考虑使用swap方式&#xff0c;置换一些内存资源存放swap磁盘。 [rootxxx myblog]# npm run docs:dev> myblog1.0.0 docs:dev > vuep…

全角色服务、全场景支撑、全业务应用的新一代智慧教室

新一代智慧教室以“数智化助力高质量人才培养”为核心目标&#xff0c;以AI赋能的智能硬件为基础构建多形态智慧教学环境&#xff0c;以中台为支撑实现数据、设备、系统、业务的互联互通、开放共享&#xff0c;以平台全面覆盖教学应用&#xff0c;采集、汇聚、挖掘、分析课前课…

【解决】IntelliJ IDEA 重命名 Shift + F6 失效

IntelliJ IDEA 重命名 Shift F6 失效 问题解决 问题 Idea 重命名 Shift F6 &#xff0c;一直没反应 解决 调查发现原因是微软新版的输入法冲突了。需要设置【使用以前版本的微软拼音输入法】解决兼容性。 设置 -> 时间和语言 -> 区域 -> 语言选项 -> 键盘选项…

公众号迁移公证书模板在哪里下载?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;公众号迁移的作用可不止变更主体这一个哦&#xff0c;它还可以把个人公众号变成企业公众号&#xff0c;或者把服务号变成订阅号&#xff0c;甚至还能开通留言功能。不过要注意&#xff0c;现在订阅号已经不能变成服…

软考计算题注意事项总结

1、沟通渠道中&#xff0c;N涉及多少人&#xff1f;是有所增加还是增至多少人&#xff1f; 2、在EMV中&#xff0c;关注的是成本还是收益&#xff1f;若是考虑成本和时间&#xff0c;则选择较小的方案&#xff1b;若是关注收益&#xff0c;则选择较大的方案。 3、在PERT中&am…

什么是数据库设计?基本步骤有哪些?

数据库设计结构图 实线代表输入&#xff0c;虚线代表输出&#xff0c;每个节点的输出作为下一个节点的输入。 基本步骤 1.需求分析阶段 数据需求分析是在项目确定之后&#xff0c;用户和设计人员对数据库应用系统所要涉及的内容&#xff08;数据&#xff09;和功能&#xff0…

JSP在线阅读系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc

一、源码特点 JSP 小说在线阅读系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为SQLServer2008&#…

C#语法(关键字)

C#关键字 关键字是C#编译器预定义的保留字。这些关键字不能作为标识符&#xff0c;但是&#xff0c;如果您想要用它们做标识符&#xff0c;在这个前面加个字符做前缀。 保留关键字abstractasbaseboolbreakbytecasecatchcharcheckedclassconstcontinuedecimaldefaultdelegated…

com.spring4all 版本问题旧版本下载不了

在pom.xml中引入依赖&#xff1a; <dependency><groupId>com.spring4all</groupId><artifactId>swagger-spring-boot-starter</artifactId><version>2.0.2.RELEASE</version> </dependency> 注意 从1.6.0开始&#xff0c…

安装 java 的 JDK

前几天重装系统以后想起来要重装 java 的JDK 安装地址 Windows 下的 JDK 数据包有三种可选的下载&#xff1a;Windows x64 Compressed Archive、Windows x64 Installer 和 Windows x64 MSI Installer。其中&#xff0c;前者为 JDK 的免安装版本&#xff0c;后两者均为 JDK 的离…