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

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
基于Uniapp的HarmonyOS 5.0体育应用开发攻略
一、技术架构设计 1.混合开发框架选型 (1)使用Uniapp 3.8版本支持ArkTS编译 (2)通过uni-harmony插件调用原生能力 (3)分层架构设计: graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...

Web APIS Day01
1.声明变量const优先 那为什么一开始前面就不能用const呢,接下来看几个例子: 下面这张为什么可以用const呢?因为复杂数据的引用地址没变,数组还是数组,只是添加了个元素,本质没变,所以可以用con…...