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

news/2024/7/21 3:56:57 标签: 服务器, 运维, 图像处理

 一、实验目的

掌握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 <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文件夹内的文件如图所示

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

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

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

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

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


http://www.niftyadmin.cn/n/5213542.html

相关文章

ArkTS基础知识 【习题】

判断题 1.循环渲染ForEach可以从数据源中迭代获取数据&#xff0c;并为每个数组项创建相应的组件。 正确(True) 2. Link变量不能在组件内部进行初始化。 正确(True) 单选题 1.用哪一种装饰器修饰的struct表示该结构体具有组件化能力&#xff1f;(A) A. Component B. Entry C…

什么是 Jest ? Vue2 如何使用 Jest 进行单元测试?Vue2 使用 Jest 开发单元测试实例

什么是Jest? Jest 是一个流行的 JavaScript 测试框架,由 Facebook 开发并维护,专注于简单性和速度。它通常用于编写 JavaScript 和 TypeScript 应用程序的单元测试、集成测试和端到端测试。 特点: 简单易用: Jest 提供简洁的 API 和易于理解的语法,使得编写测试用例变得…

物联网后端个人第十二周总结

学习工作进度 物联网方面 1.模拟设备通过规则引擎将数据通过mqtt进行转发 在物联网平台上实现模拟设备通过规则引擎将数据通过mqtt进行转发已经全部完成了&#xff0c;所使用的物联网平台在这方面有不少的问题和bug&#xff0c;也可能是没有按照开发者的想法对平台进行使用才导…

没搞懂二维差分是什么怎么办???

摸鱼的时候画的&#xff0c;根据公式反推 一维差分倒是懂了 a[10]{1,2,6,9,11,12,17,21,32,67}; c[10]{1,1,4,3,2,1,5,4,11,35}; 现要把[3,7]的值都增加3 c[10]{1,1,7,3,2,1,5,1,11,35}; 要查询的时候再用for循环相加 结论&#xff1a;成立且适用于多次修改 不知道为什么这个…

晨控CK-FR03-EIP读卡器与欧姆龙NX/NJ系列EtherNet/IP通讯手册

晨控CK-FR03-EIP读卡器与欧姆龙NX/NJ系列EtherNet/IP通讯手册 CK-FR03-EIP是一款基于射频识别技术的高频RFID标签读卡器&#xff0c;读卡器工作频率为13.56MHZ&#xff0c;支持对I-CODE 2、I-CODE SLI等符合ISO15693国际标准协议格式标签的读取。 读卡器同时支持标准工业通讯…

关于pytorch以及相关包的安装教程

一.查看自己电脑的配置 首先查看自己电脑的cuda的版本&#xff0c;WinR,敲入cmd打开终端 输入nvidia-smi&#xff0c;查看自己电脑的显卡等配置 这里要说明一下关于这个CUDA,它具有向后兼容性&#xff0c;这意味着支持较低版本的 CUDA 的应用程序通常也可以在较高版本的 CUD…

通过互联网代理部署Docker+Kubernetes 1.28.1

一、背景 在公司环境中&#xff0c;我们往往都是无法直接连接外网的&#xff0c;之前写过一篇文章&#xff0c;是通过外网自建的中转机器下载需要的离线包&#xff0c;并在内网搭建一个harbor&#xff0c;通过harbor的方式搭建了一个kubernetes&#xff0c;但是这种方式还是有…

aardio调用dll中遇到的难点

近期在做的一个项目&#xff0c;需要调用到32位的dll 查看了dll开发给的函数说明&#xff0c;返回的字符是一个指针地址 虽然在arrdio里面调用成功&#xff0c;但是还需要还原成字符&#xff0c;查了很多资料&#xff0c;程度有限&#xff0c;但是还是找到了一篇文章有讲到&…