一、实验目的
掌握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。
代码调用方式参考如下:
5.2 OpenCV下图像加权融合方法
在OpenCV下可以通过addweight函数来实现。其参数设置与BMCV的bmcv_image_add_weighted一致,参考代码如下:
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
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文件夹内的文件如图所示
要融合的两张图片如图所示:
给可执行文件赋权限并执行
执行结果如下所示(生成out.jpg)
生成的结果out.jpg如图所示