自学内容网 自学内容网

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)!