【OpenCV 】对极几何标定质量验证
标定质量验证:
寻找一对对应点,已经知道对应关系及其详细坐标,根据对极几何推导实现
///get the camera intrinsics and T_Ci_Bstd::vector<Eigen::Matrix3d> M_K;std::vector<Eigen::Matrix4d> T_Ci_B;for (int i = 0; i < new_frames->size(); ++i) {auto frame = new_frames->frames_[i];auto project = cams_->getCameraShared(i);auto k = project->getIntrinsicParameters();Eigen::Matrix3d M_Ki;M_Ki << k(0), 0, k(2), 0, k(1), k(3), 0, 0, 1;M_K.push_back(M_Ki);Eigen::Matrix4d T_Ci_B_temp = cams_->get_T_C_B(i).getTransformationMatrix();T_Ci_B.emplace_back(T_Ci_B_temp);}///get T_C0_Cistd::vector<Eigen::Matrix4d> T_C0_Ci;for (int i = 1; i < new_frames->size(); ++i) {Eigen::Matrix4d T_C0_Ci_temp = T_Ci_B[0].inverse() * T_Ci_B[i];T_C0_Ci.emplace_back(T_C0_Ci_temp);}std::cout<<"T_C0_Ci : "<<T_C0_Ci.size()<<std::endl;///get t^Rstd::vector<Eigen::Matrix3d> R_C0_Ci;std::vector<Eigen::Matrix3d> t_transpose_R;for (int i = 0; i < T_C0_Ci.size(); ++i) {Eigen::Vector3d t_C0_Ci_temp;Eigen::Matrix3d R_C0_Ci_temp,skew_t,skew_t_transpose_R_temp;R_C0_Ci_temp = T_C0_Ci[i].block(0,0,3,3);t_C0_Ci_temp = T_C0_Ci[i].block(0,3,3,1);skew_t << 0, -t_C0_Ci_temp(2), t_C0_Ci_temp(1),t_C0_Ci_temp(2), 0, -t_C0_Ci_temp(0),-t_C0_Ci_temp(1), t_C0_Ci_temp(0), 0;R_C0_Ci.emplace_back(R_C0_Ci_temp);skew_t_transpose_R_temp = skew_t.transpose() * R_C0_Ci_temp;t_transpose_R.emplace_back(skew_t_transpose_R_temp);}/// l2 = K(^-1)_2 * t^R * K(^-1)_1 * p1 =F2 * p1for (int i = 0; i < new_frames->size(); ++i) {auto ld = new_frames->at(i)->landmark_vec_;for (int j = 0; j < ld.size(); ++j) {if(ld[j] == nullptr)continue;auto px = new_frames->frames_[i]->px_vec_.col(j);Eigen::Vector3d p_norm;p_norm << px.x(),px.y(),1;Eigen::Vector3d p_norm_corresponding;Eigen::Vector3d l_0i = M_K[i+1].inverse() * t_transpose_R[i] * M_K[i] * p_norm;double dist = std::abs(p_norm_corresponding.dot(l_0i.head<3>()) + l_0i(3)) / l_0i.head<3>().norm();std::cout<<"dist: "<<dist<<std::endl;if(1){cv::Mat img_show = new_frames->frames_[i]->image_;std::string name = "Calib_Check";cv::namedWindow(name, cv::WINDOW_NORMAL);cv::resizeWindow(name, img_show.cols, img_show.rows);cv::KeyPoint kp_show = cv::KeyPoint(px.x(),px.y(),1);std::vector<cv::KeyPoint> kps;kps.emplace_back(kp_show);cv::drawKeypoints(img_show, kps, img_show, cv::Scalar(0, 0, 255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);cv::waitKey(0);}break;}}
NOLOCalibParams<float> calib_params = m_calib_params;// std::vector<float> K0 = m_calib_params.Ks[0];// std::vector<float> D0 = m_calib_params.Ds[0];// std::vector<float> K1 = m_calib_params.Ks[1];// std::vector<float> D1 = m_calib_params.Ds[1];// std::vector<float> K2 = m_calib_params.Ks[2];// std::vector<float> D2 = m_calib_params.Ds[2];// std::vector<float> K3 = m_calib_params.Ks[3];// std::vector<float> D3 = m_calib_params.Ds[3];// cv::Mat cur_K0 = (cv::Mat_<double>(3, 3) << K0[0], 0, K0[2], 0, K0[1],// K0[3], 0, 0, 1); cv::Mat cur_K1 = (cv::Mat_<double>(3, 3) << K1[0], 0,// K1[2], 0, K1[1], K1[3], 0, 0, 1); cv::Mat cur_K2 = (cv::Mat_<double>(3, 3)// << K2[0], 0, K2[2], 0, K2[1], K2[3], 0, 0, 1); cv::Mat cur_K3 =// (cv::Mat_<double>(3, 3) << K3[0], 0, K3[2], 0, K3[1], K3[3], 0, 0, 1);// cv::Mat cur_D_fisheye = (cv::Mat_<double>(4, 1) << D0[0], D0[1], D0[2],// D0[3]);//// Eigen::Map<const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>>// eigenMat0(cur_K0.ptr<double>()); Eigen::Matrix3d M_K0 = eigenMat0;// Eigen::Map<const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>>// eigenMat1(cur_K1.ptr<double>()); Eigen::Matrix3d M_K1 = eigenMat1;// Eigen::Map<const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>>// eigenMat2(cur_K2.ptr<double>()); Eigen::Matrix3d M_K2 = eigenMat2;// Eigen::Map<const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>>// eigenMat3(cur_K3.ptr<double>()); Eigen::Matrix3d M_K3 = eigenMat3;std::vector<Eigen::Matrix3d> M_K;for (int i = 0; i < m_calib_params.T_C_Cs.size(); ++i) {std::vector<float> Ki = m_calib_params.Ks[i];cv::Mat cur_Ki =(cv::Mat_<double>(3, 3) << Ki[0], 0, Ki[2], 0, Ki[1], Ki[3], 0, 0, 1);Eigen::Map<const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>> eigenMati(cur_Ki.ptr<double>());Eigen::Matrix3d M_Ki = eigenMati;M_K.emplace_back(M_Ki);}std::vector<std::vector<float>> T_C_Ci = calib_params.T_C_Cs;std::vector<Eigen::Matrix3d> cur_R_C_Ci;std::vector<Eigen::Vector3d> cur_t_C_Ci;std::vector<Eigen::Matrix3d> skew_t_C_Ci;for (auto &data : m_calib_params.T_C_Cs) {Eigen::Vector3d t;std::vector<float> tq;vector2tq(tq, data);t[0] = (double)tq[0];t[1] = (double)tq[1];t[2] = (double)tq[2];Eigen::Matrix3d skew_t;skew_t << 0, -t(2), t(1), t(2), 0, -t(0), -t(1), t(0), 0;skew_t_C_Ci.emplace_back(skew_t);Eigen::Quaterniond q(tq[3], tq[4], tq[5], tq[6]);Eigen::Matrix3d rot = q.normalized().toRotationMatrix();cur_R_C_Ci.emplace_back(rot);cur_t_C_Ci.emplace_back(t);}// l2 = K(^-1)_2 t^R K(^-1)_1 p1 =F2 * p1std::cout << " skew_t_C_Ci size " << skew_t_C_Ci.size() << std::endl;auto sorted_p2ds = img_info.sorted_p2ds;auto p = sorted_p2ds[0][0];for (int i = 0; i < skew_t_C_Ci.size(); ++i) {Eigen::Vector3d l0i = M_K[i+1].inverse() * skew_t_C_Ci[i] * cur_R_C_Ci[i] * M_K[0] *Eigen::Vector3d(sorted_p2ds[i+1][0].x, sorted_p2ds[i+1][0].y, 1);Vector2d p_image(sorted_p2ds[i+1][0].x, sorted_p2ds[i+1][0].y);double dist = std::abs(p_image.dot(l0i.head<3>()) + l0i(3)) / l0i.head<3>().norm();// closed loop proof and adaptorif(0){cv::Mat img_show = images[i+1].clone();std::string name = "Funda";cv::namedWindow(name, cv::WINDOW_NORMAL);cv::resizeWindow(name, img_show.cols, img_show.rows);auto cur_kpts = img_info.sorted_kpts[i];cv::drawKeypoints(img_show, cur_kpts, img_show, cv::Scalar(0, 0, 255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);}}
相关文章:
【OpenCV 】对极几何标定质量验证
标定质量验证: 寻找一对对应点,已经知道对应关系及其详细坐标,根据对极几何推导实现 ///get the camera intrinsics and T_Ci_Bstd::vector<Eigen::Matrix3d> M_K;std::vector<Eigen::Matrix4d> T_Ci_B;for (int i 0; i < ne…...
Netty:ByteBuf的清空操作
说明 io.netty.buffer.ByteBuf有个函数clear(),它可以将ByteBuf的readerIndex和writerIndex都设置为0。 代码示例 package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled;public class Demo {public static void main(String[] args…...

SpringCloud最新最全面试题
目录 一、简单说一说什么是微服务? 二、微服务有哪些优缺点? 三、微服务、分布式、集群的区别? 四、什么是Eureka? 五、Eureka有那两大组件? 六、actuator是什么? 七、Discovery是什么? …...

leetcode359周赛
2828. 判别首字母缩略词 核心思想:枚举。只需要枚举首字母和s是否一一对应即可。 2829. k-avoiding 数组的最小总和 核心思想:自己的方法就是哈希表,枚举i的时候,将k-i统计起来,如果出现了那么就跳过。灵神的方法是数学法&#…...

nginx代理webSocket链接响应403
一、场景 使用nginx代理webSocket链接,nginx响应403 1、nginx访问日志响应403 [18/Aug/2023:09:56:36 0800] "GET /FS_WEB_ASS/webim_api/socket/message HTTP/1.1" 403 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit…...

websocker无法注入依赖
在公司中准备用websocker统计在线人数,在WebSocketServer使用StringRedisTemplate保存数据到redis中去,但是在保存的时候显示 StringRedisTemplate变量为null 详细问题 2023-08-20 10:37:14.109 ERROR 28240 --- [nio-7125-exec-1] o.a.t.websocket.po…...

如何进行无线网络渗透测试?
我们将重点介绍如何使用Kali Linux进行无线网络渗透测试。无线网络渗透测试是评估无线网络安全性的重要步骤,而Kali Linux作为一款专业的渗透测试发行版,提供了丰富的工具来进行这项任务。 1. 准备工作 在开始无线网络渗透测试之前,有一些准…...

【Python机器学习】实验15 将Lenet5应用于Cifar10数据集(PyTorch实现)
文章目录 CIFAR10数据集介绍1. 数据的下载2.修改模型与前面的参数设置保持一致3. 新建模型4. 从数据集中分批量读取数据5. 定义损失函数6. 定义优化器7. 开始训练8.测试模型 9. 手写体图片的可视化10. 多幅图片的可视化 思考题11. 读取测试集的图片预测值(神经网络的…...

Jeep车型数据源:提供Jeep品牌车系、车型、价格、配置等信息
Jeep是一个极具特色的汽车品牌,它的所有车型都注重实用性,具有越野性能和高性能。Jeep品牌在汽车行业中的口碑一直是非常不错的。如果你想要了解Jeep品牌车系、车型、价格、配置等信息,就可以通过挖数据平台Jeep车型数据源API接口…...
clickhouse-备份恢复
一、简介 备份恢复是数据库常用的手段,可能大多数公司很少会对大数据所使用的数据进行备份,这里还是了解下比较好,下面做了一些简单的介绍,详细情况可以通过官网来查看,经过测试发现Disk中增量备份并不好用࿰…...

(2018,ProGAN)渐进式发展 GAN 以提高质量、稳定性和变化
Progressive Growing of GANs for Improved Quality, Stability, and Variation 公众号:EDPJ 目录 0. 摘要 1. 简介 2. GAN 的渐进式发展 3. 使用小批量标准差增加变化 4. 生成器和判别器的归一化 4.1 均衡学习率 4.2 生成器中的像素特征向量归一化 5. 评…...

负载均衡下的 WebShell 连接
目录 负载均衡简介负载均衡的分类网络通信分类 负载均衡下的 WebShell 连接场景描述难点介绍解决方法**Plan A** **关掉其中一台机器**(作死)**Plan B** **执行前先判断要不要执行****Plan C** 在Web 层做一次 HTTP 流量转发 (重点࿰…...

Postman的高级用法—Runner的使用
1.首先在postman新建要批量运行的接口文件夹,新建一个接口,并设置好全局变量。 2.然后在Test里面设置好要断言的方法 如: tests["Status code is 200"] responseCode.code 200; tests["Response time is less than 10000…...

spring如何进行依赖注入,通过set方法把Dao注入到serves
1、选择Generate右键鼠标 你在service层后面方法的这些: 2、UserService配置文件的写法是怎样的: 3、我们在UserController中执行一下具体写法: 最后我们执行一下 : 4、这里可能出现空指针,因为你当前web层,因为你new这个对象根…...
Python使用图像处理库PIL(Python Imaging Library)和NumPy库来比较两副图像的相似度
目录 1、解释说明: 2、使用示例: 3、注意事项: 1、解释说明: 在Python中,我们可以使用图像处理库PIL(Python Imaging Library)和NumPy库来比较两副图像的相似度。常用的图像相似度计算方法有…...
clickhouse扩缩容
一、背景 我们之前已经学会了搭建clickhouse集群,我们搭建的是一套单分片两副本的集群,接下来我们来测试下clickhouse的扩缩容情况 二、扩容 扩容相对来说比较简单,我们原来的架构如下 hostshardreplica192.169.1.111192.169.1.212 现在…...

动漫3D虚拟人物制作为企业数字化转型提供强大动力
一个 3D 虚拟数字人角色的制作流程,可以分为概念设定-3D 建模-贴图-蒙皮-动画-引擎测试六个步骤,涉及到的岗位有原画师、模型师、动画师等。角色概念设定、贴图绘制一般是由视觉设计师来完成;而建模、装配(骨骼绑定)、渲染动画是由三维设计师来制作完成。…...

数据同步工具比较:选择适合您业务需求的解决方案
在当今数字化时代,数据已经成为企业的核心资产。然而,随着业务的扩展和设备的增多,如何实现数据的高效管理和同步成为了一个亟待解决的问题。本文将介绍几种常见的数据同步工具,并对比它们的功能、性能和适用场景,帮助…...

Python中数据结构列表详解
列表是最常用的 Python 数据类型,它用一个方括号内的逗号分隔值出现,列表的数据项不需要具有相同的类型。 列表中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。列表都可…...

引领行业高质量发展|云畅科技参编《低代码开发平台创新发展路线图(2023)》
8月8日-9日,中国电子技术标准化研究院于北京顺利召开《低代码开发平台创新发展路线图(2023)》封闭编制会。云畅科技、浪潮、百度、广域铭岛等来自低代码开发平台解决方案供应商、用户方、科研院所等近30家相关单位的40余位专家参与了现场编制…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...