【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余位专家参与了现场编制…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...