福州大学《嵌入式系统综合设计》实验六:图像加权融合

 一、实验目的

掌握bmcv_image_add_weighted的使用

二、实验内容

搭建BMCV环境并成功运行加权融合例程

三、开发环境

开发主机:Ubuntu 22.04 LTS

硬件:算能SE5

本地如果有SE5硬件,则可以PC机作为客户端,SE5作为服务器端。本地如果没有SE5硬件,只有云空间,则可以直接将客户端和服务器端都通过云空间实现,机在云空间的SE5模拟环境中实现。

四、实验器材

开发主机 + 云平台

五、实验过程与结论

本实验涉及的程序框架与实验4的图4-1一致,仅需根据具体调用的API函数配置相关参数即可,因此接下来重点介绍bmcv_image_add_weightedAPI函数的参数及其调用方法。

在图像处理中,需要对多张图像进行加权融合,以得到新的图像。如场景拼接中,拼接部分可以通过对左右两张图片进行加权融合,实现更为自然的过渡;或者需要兼顾两张图像的信息时,也可以进行加权融合。这可以通过bmcv提供的bmcv_image_add_weighted函数实现。

5.1 bmcv_image_add_weighted函数 
bm_status_t bmcv_image_add_weighted(
    bm_handle_t handle,
    bmcv_image input1,
    float alpha,
    bm_image input2,
    float beta,
    float gamma,
    bm_image output)

其中,handle为bm_handle 句柄; input1,input2 为待融合的两个bm_image 对象,必须具有相同的宽、高; output为融合后输出的图像。 alpha、beta、gamma则是融合的参数,即将图片数据按照下式进行融合,其中,要求alpha+beta=1。

out = input1*alpha+input2*beta+gamma

代码调用方式参考如下:

bmcv_image_add_weighted(handle,input1,0.5,input2,0.5,0,output) 

5.2 OpenCV下图像加权融合方法

在OpenCV下可以通过addweight函数来实现。其参数设置与BMCV的bmcv_image_add_weighted一致,参考代码如下:

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include 
using namespace cv;
using namespace std;

int main( void )
{
    double alpha = 0.5; double beta; double input;
    Mat src1, src2, dst;
    cout << " Simple Linear Blender " << endl;
    cout << "-----------------------" << endl;
    cout << "* Enter alpha [0-1]: ";
    cin >> input;

    // We use the alpha provided by the user if it is between 0 and 1
    If (input >= 0 && input <= 1) { 
        alpha = input; 
    }
    
    src1 = imread( "../data/LinuxLogo.jpg" );
    src2 = imread( "../data/WindowsLogo.jpg" );
    
    If ( src1.empty() ) {
        cout << "Error loading src1" << endl; 
        return -1; 
    }
    
    If ( src2.empty() ) { 
        cout << "Error loading src2" << endl; 
        return -1; 
    }
    
    beta = ( 1.0 - alpha );
    addWeighted( src1, alpha, src2, beta, 0.0, dst);
    imshow( "Linear Blend", dst );
    waitKey(0);
    return 0;
}
5.3 执行结果
按照上述步骤,生成可执行文件并上传到算能盒子,执行:

此时bmcv_weight文件夹内的文件如图所示

root@b3e319d8aoc8:~/bmnnsdk2-bm1684_v2.7.0/examples/bmcv_weight ls

Makefile Readme.md bmcv_weight bmcv_weight.cpp bmcv_weight.o _common.h  cutecat.jpeg cutedog.jpeg

要融合的两张图片如图所示:

福州大学《嵌入式系统综合设计》实验六:图像加权融合_第1张图片

福州大学《嵌入式系统综合设计》实验六:图像加权融合_第2张图片

给可执行文件赋权限并执行

root@b3e319d8aBc8:~/bmnnsdk2-bm1684_v2.7.0/examples/bmcv_sobel# chmod 777 bmcv_sobel
root@b3e319d8aBc8:~/bmnnsdk2-bm1684_v2.7.0/examples/bmcv_sobel# ./bmcv_sobel greycat.jpeg

Open /dev/ipu successfully,device index = 0,ipu fd =8, vpp fd = 9

执行结果如下所示(生成out.jpg)

[ bmlib_memory][error] free gmem failed!
root@b3e319d8a0c8:~/bmnnsdk2-bm1684_v2.7.0/examples/bmcv_weight# ls
MakefileReadme.md bmcv_weight bmcv_ weight.cpp bmcv_weight.o _common.h cutecat.jpeg cutedog.jpeg out.jpg

福州大学《嵌入式系统综合设计》实验六:图像加权融合_第3张图片

生成的结果out.jpg如图所示 

你可能感兴趣的:(嵌入式系统综合设计,服务器,运维,图像处理)