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等不同深度的图像也都可以这样转换。
原文地址:https://blog.csdn.net/yindq1220/article/details/135841960
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!