RK3588 opencv maliGPU图像拼接

1 左边图

图像大小:1920*1080

在这里插入图片描述

2右边图

图像大小:1920*1080
在这里插入图片描述

3拼接好的图像

图像大小:1920 *1080
在这里插入图片描述

4代码

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>//图像融合
#include <opencv2/xfeatures2d.hpp>//拼接算法
#include <opencv2/calib3d.hpp>
#include <opencv2/imgproc.hpp>
#include"openclTool.h"using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;typedef struct
{Point2f left_top;Point2f left_bottom;Point2f right_top;Point2f right_bottom;
}four_corners_t;four_corners_t corners;void CalcCorners(const Mat& H, const Mat& src)
{double v2[] = { 0, 0, 1 };//左上角double v1[3];//变换后的坐标值Mat V2 = Mat(3, 1, CV_64FC1, v2);  //列向量Mat V1 = Mat(3, 1, CV_64FC1, v1);  //列向量V1 = H * V2;//左上角(0,0,1)cout << "V2: " << V2 << endl;cout << "V1: " << V1 << endl;corners.left_top.x = v1[0] / v1[2];corners.left_top.y = v1[1] / v1[2];//左下角(0,src.rows,1)v2[0] = 0;v2[1] = src.rows;v2[2] = 1;V2 = Mat(3, 1, CV_64FC1, v2);  //列向量V1 = Mat(3, 1, CV_64FC1, v1);  //列向量V1 = H * V2;corners.left_bottom.x = v1[0] / v1[2];corners.left_bottom.y = v1[1] / v1[2];//右上角(src.cols,0,1)v2[0] = src.cols;v2[1] = 0;v2[2] = 1;V2 = Mat(3, 1, CV_64FC1, v2);  //列向量V1 = Mat(3, 1, CV_64FC1, v1);  //列向量V1 = H * V2;corners.right_top.x = v1[0] / v1[2];corners.right_top.y = v1[1] / v1[2];//右下角(src.cols,src.rows,1)v2[0] = src.cols;v2[1] = src.rows;v2[2] = 1;V2 = Mat(3, 1, CV_64FC1, v2);  //列向量V1 = Mat(3, 1, CV_64FC1, v1);  //列向量V1 = H * V2;corners.right_bottom.x = v1[0] / v1[2];corners.right_bottom.y = v1[1] / v1[2];}//图像融合的去裂缝处理操作
void OptimizeSeam(Mat& img1, Mat& trans, Mat& dst)
{int start = MIN(corners.left_top.x, corners.left_bottom.x);//开始位置,即重叠区域的左边界double processWidth = img1.cols - start;//重叠区域的宽度int rows = dst.rows;int cols = img1.cols; //注意,是列数*通道数double alpha = 1;//img1中像素的权重for (int i = 0; i < rows; i++){uchar* p = img1.ptr<uchar>(i);  //获取第i行的首地址uchar* t = trans.ptr<uchar>(i);uchar* d = dst.ptr<uchar>(i);for (int j = start; j < cols; j++){//如果遇到图像trans中无像素的黑点,则完全拷贝img1中的数据if (t[j * 3] == 0 && t[j * 3 + 1] == 0 && t[j * 3 + 2] == 0){alpha = 1;}else{//img1中像素的权重,与当前处理点距重叠区域左边界的距离成正比,实验证明,这种方法确实好alpha = (processWidth - (j - start)) / processWidth;}d[j * 3] = p[j * 3] * alpha + t[j * 3] * (1 - alpha);d[j * 3 + 1] = p[j * 3 + 1] * alpha + t[j * 3 + 1] * (1 - alpha);d[j * 3 + 2] = p[j * 3 + 2] * alpha + t[j * 3 + 2] * (1 - alpha);}}
}int run()
{//左图Mat left = imread("0519_1.jpg");//右图Mat right = imread("0519_2.jpg");resize(left, left, Size(1920,1080), 0, 0, INTER_LINEAR);resize(right, right, Size(1920,1080), 0, 0, INTER_LINEAR);//左右图显示imshow("left",left);imshow("right",right);imwrite("left.jpg",left);imwrite("right.jpg",right);//创建SURF对象Ptr<SURF> surf;//create 函数参数 海森矩阵阀值 800特征点以内surf = SURF::create(800);//创建一个暴力匹配器 用于特征点匹配BFMatcher matcher;//特征点容器 存放特征点KeyPointvector<KeyPoint>key1,key2;//保存特征点Mat c,d;//1、选择特征点//左图 右图 识别特征点 是Mat对象 用c d保存surf->detectAndCompute(left,Mat(),key2,d);surf->detectAndCompute(right,Mat(),key1,c);//特征点对比,保存   特征点为中心点区域比对vector<DMatch> matches;matcher.match(d,c,matches);//排序从小到大 找到特征点连线sort(matches.begin(),matches.end());//2、保存最优的特征点对象vector<DMatch>good_matches;int ptrpoint = std::min(50,(int)(matches.size()*0.15));for (int i = 0;i < ptrpoint;i++){good_matches.push_back(matches[i]);}//2-1、画线 最优的特征点对象连线Mat outimg;drawMatches(left,key2,right,key1,good_matches,outimg,Scalar::all(-1),Scalar::all(-1),vector<char>(),DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);//imshow("outimg",outimg);//3、特征点匹配vector<Point2f>imagepoint1,imagepoint2;for (int i= 0 ;i < good_matches.size();i++){//查找特征点可连接处                          变形imagepoint1.push_back(key1[good_matches[i].trainIdx].pt);//查找特征点可连接处                          查找基准线imagepoint2.push_back(key2[good_matches[i].queryIdx].pt);}//4、透视转换 图形融合Mat homo = findHomography(imagepoint1,imagepoint2,cv::RANSAC);//imshow("homo",homo);//根据透视转换矩阵进行计算 四个坐标CalcCorners(homo,right);//接收透视转换结果while (1){auto time0=time();Mat imageTransForm;//透视转换warpPerspective(right,imageTransForm,homo,Size(MAX(corners.right_top.x,corners.right_bottom.x),left.rows));//右图透视变换 由于本次图片材料是自己截图拼接的 因此看不出透视变换的明显特征//imshow("imageTransForm",imageTransForm);//结果进行整合int dst_width = imageTransForm.cols;int dst_height = left.rows;Mat dst(dst_height,dst_width,CV_8UC3);dst.setTo(0);imageTransForm.copyTo(dst(Rect(0,0,imageTransForm.cols,imageTransForm.rows)));left.copyTo(dst(Rect(0,0,left.cols,left.rows)));//5、优化图像OptimizeSeam(left,imageTransForm,dst);auto time1=time();auto time_use = time_diff(time0, time1);std::cout << "--=--]time cost-:" <<time_use <<std::endl;//最终图像拼接结果imshow("dst",dst);waitKey(1);}return 0;
}
int main()
{while(1)
{run();}  
}

5 运作速度,单位ms

在这里插入图片描述

6 maliGPU资源占用

在这里插入图片描述

7 CPU 和内存资源占用

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot和Mybatis实现的留言板案例

目录 一、需求及界面展示 二、准备工作 引入依赖 .yml文件相关配置 数据库数据准备 三、编写后端代码 需求分析 代码结构 Model Mapper Service Controller 前端代码 四、测试 一、需求及界面展示 需求&#xff1a; 1. 输入留言信息&#xff0c;点击提交&…

Unity对接科大讯飞实时语音转写WebAPI(Windows平台)(二)

上一篇中&#xff0c;用到的是MicPhone类&#xff0c;然后遗留问题是yield return new WaitForSecondsRealtime(0.04f)导致消息发送得很慢&#xff0c;语音识别不及时。 上一篇链接&#xff1a;Unity对接科大讯飞实时语音转写WebAPI&#xff08;Windows平台&#xff09;_unity…

qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面

qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容&#xff0c;使其不阻塞主界面 code review! 文章目录 qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容&#xff0c;使其不阻塞主界面1.QtConcurrent::run基本用法基本用法启动一个全局函数或静态成员函数使用 Lambda…

iOS--锁的学习

iOS--锁的学习 锁的介绍线程安全 锁的分类自旋锁和互斥锁OSSpinLockos_unfair_lockpthread_mutexpthread_mutex的属性 NSLockNSRecursiveLockNSConditionNSConditionLockdispatch_semaphoredispatch_queuesynchronizedatomicpthread_rwlock&#xff1a;读写锁dispatch_barrier_…

摸鱼大数据——Hive基础理论知识——Hive基础架构

1、Hive和MapReduce的关系 1- 用户在Hive上编写数据分析的SQL语句&#xff0c;然后再通过Hive将SQL语句翻译成MapReduce程序代码&#xff0c;最后提交到Yarn集群上进行运行 2- 大家可以将Hive理解成有道词典&#xff0c;帮助你翻译英文 2、Hive架构 用户接口: 包括 CLI、JDBC/…

武汉大学化学与分子科学学院雷爱义教授

国务院政府特殊津贴专家(2020)&#xff0c;第四届Yoshida Prize(吉田奖&#xff0c;2019)&#xff0c;国家“万人计划”科技创新领军人才(2017)&#xff0c;国家中青年科技创新领军人才(2015)&#xff0c;英国皇家化学学会会士(2015)&#xff0c;长江学者特聘教授(2014)&#x…

【数字移动通信】期末突击

文章目录 复习题一.简答题1、常用的移动通信系统有哪些?2、分别列出1G,2G,3G,4G的典型系统或标准&#xff1f;3、移动通信信道的基本特征&#xff1f;4、电波传播预测模型是用来计算什么量的&#xff0c;在选择传播预测模型时&#xff0c;主要考虑哪些因素&#xff1f;5、什么…

Java+Swing+Mysql实现飞机订票系统

一、系统介绍 1.开发环境 操作系统&#xff1a;Win10 开发工具 &#xff1a;Eclipse2021 JDK版本&#xff1a;jdk1.8 数据库&#xff1a;Mysql8.0 2.技术选型 JavaSwingMysql 3.功能模块 4.数据库设计 1.用户表&#xff08;users&#xff09; 字段名称 类型 记录内容…

脑机接口习题

9-12章习题 填空题 EEG电极分为 主动电极 和 被动电极 &#xff0c;其中 被动电极 直接与放大器连接&#xff0c; 主动电极 包含一个1~10倍的前置放大。除抗混淆滤波器&#xff0c;放大系统也包含由电阻器、电容器构成的模拟滤波器&#xff0c;把信号频率内容限制在一个特定的…

B树与B+树区别

B树和B树是常见的数据库索引结构&#xff0c;都具有相较于二叉树层级较少&#xff0c;查找效率高的特点&#xff0c;它们之间有以下几个主要区别&#xff1a; 1.节点存储数据的方式不同 B树的叶子结点和非叶子节点都会存储数据&#xff0c;指针和数据共同保存在同一节点中B树…

SpringMVC相关知识集锦----1

一、springMVC框架的了解 springMVC是一个基于java的实现了MVC设计模式的请求驱动类型的轻量级web框架,通过把model,view,controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发. 二、springMVC主要组件 1.前端控制器(dispatcherservlet):接收请…

【深度学习】复习温故而知新1

数据集ref&#xff1a;https://raw.githubusercontent.com/justinge/pic-go-for-xbotgo/master/Income1.csv X torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32)) Y torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float32))y_pred…

当标签中出现输入了字母或者数字直接在一行上,没有换行的 情况时怎么办

当标签块中输入的是包含字母或者数字的时候&#xff0c;他不会换行&#xff0c;在一行上显示滚动条的形式&#xff0c;而我们想让他走正常文档流&#xff0c;该换行的时候换行 想要的如下效果 给相应的元素块添加该代码即可 word-break: break-all; .card-content { …

Dubbo与Spring Cloud等微服务框架的深度比较及选型指南

在当今的微服务架构领域&#xff0c;Dubbo与Spring Cloud作为两大主流框架&#xff0c;各自拥有独特的设计理念与技术优势&#xff0c;广泛应用于不同规模和类型的项目中。本文将从多个维度深入比较Dubbo、Spring Cloud以及其他代表性微服务框架&#xff08;如gRPC、Istio&…

酷开科技大屏营销,多元需求唤醒“客厅经济”

随着科技的发展和消费者习惯的变化&#xff0c;OTT大屏营销正逐渐成为客厅经济的新风向。OTT不仅改变了人们获取信息和娱乐的方式&#xff0c;也为品牌营销提供了新的机遇和挑战&#xff0c;OTT大屏营销已经成为客厅经济的重要组成部分。酷开科技通过其自主研发的智能电视操作系…

搜维尔科技:第九届元宇宙数字人设计大赛入围作品名单

随着第九届元宇宙数字人设计大赛渐近尾声&#xff0c;各院校提交的数字人作品已陆续完成评分统计汇总工作&#xff01;现将入围名单公布&#xff0c;请入围团队尽可能到场参加大赛颁奖典礼&#xff0c;具体获奖名次将在颁奖典礼中现场公布&#xff01; 颁奖典礼时间、地点&…

Codeforces Round 946 (Div. 3) C D

比赛链接&#xff1a;Dashboard - Codeforces Round 946 (Div. 3) - Codeforces 写在前面:比赛时C题卡了挺久&#xff0c;还没做出来&#xff08;qwq&#xff09;&#xff0c;D题也只是草草看了几眼&#xff0c;看榜单D题过的人数大于C题&#xff0c;写不出C题导致没心思看D题了…

不小心关闭了Linux的终端窗口怎么恢复文件?

当你在用vim编写程序的时候&#xff0c;没有保存你正在编写的程序&#xff0c;不小心关闭了窗口&#xff0c;而当你重新进入这个.c文件的时候&#xff0c;发现变成了只读文件&#xff1f;而且没有刚刚写的程序了&#xff1f;那刚刚写的程序是不是白写了&#xff1f; 不要慌&am…

一文了解 - GPS/DR组合定位技术

GPS Global Position System 全球定位系统这个大家都很熟悉&#xff0c; 不做太多介绍。 DR Dead Reckoning 车辆推算定位法&#xff0c; 一种常用的辅助的车辆定位技术。 DR系统的优点&#xff1a; 不需要发射和接收信号&#xff1b; 不受电磁波干扰。 DR系统的缺点&#x…