当前位置: 首页 > news >正文

【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 】对极几何标定质量验证

标定质量验证&#xff1a; 寻找一对对应点&#xff0c;已经知道对应关系及其详细坐标&#xff0c;根据对极几何推导实现 ///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()&#xff0c;它可以将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最新最全面试题

目录 一、简单说一说什么是微服务&#xff1f; 二、微服务有哪些优缺点&#xff1f; 三、微服务、分布式、集群的区别&#xff1f; 四、什么是Eureka&#xff1f; 五、Eureka有那两大组件&#xff1f; 六、actuator是什么&#xff1f; 七、Discovery是什么&#xff1f; …...

leetcode359周赛

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

nginx代理webSocket链接响应403

一、场景 使用nginx代理webSocket链接&#xff0c;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统计在线人数&#xff0c;在WebSocketServer使用StringRedisTemplate保存数据到redis中去&#xff0c;但是在保存的时候显示 StringRedisTemplate变量为null 详细问题 2023-08-20 10:37:14.109 ERROR 28240 --- [nio-7125-exec-1] o.a.t.websocket.po…...

如何进行无线网络渗透测试?

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

【Python机器学习】实验15 将Lenet5应用于Cifar10数据集(PyTorch实现)

文章目录 CIFAR10数据集介绍1. 数据的下载2.修改模型与前面的参数设置保持一致3. 新建模型4. 从数据集中分批量读取数据5. 定义损失函数6. 定义优化器7. 开始训练8.测试模型 9. 手写体图片的可视化10. 多幅图片的可视化 思考题11. 读取测试集的图片预测值&#xff08;神经网络的…...

Jeep车型数据源:提供Jeep品牌车系、车型、价格、配置等信息

​​​​​ Jeep是一个极具特色的汽车品牌&#xff0c;它的所有车型都注重实用性&#xff0c;具有越野性能和高性能。Jeep品牌在汽车行业中的口碑一直是非常不错的。如果你想要了解Jeep品牌车系、车型、价格、配置等信息&#xff0c;就可以通过挖数据平台Jeep车型数据源API接口…...

clickhouse-备份恢复

一、简介 备份恢复是数据库常用的手段&#xff0c;可能大多数公司很少会对大数据所使用的数据进行备份&#xff0c;这里还是了解下比较好&#xff0c;下面做了一些简单的介绍&#xff0c;详细情况可以通过官网来查看&#xff0c;经过测试发现Disk中增量备份并不好用&#xff0…...

(2018,ProGAN)渐进式发展 GAN 以提高质量、稳定性和变化

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

负载均衡下的 WebShell 连接

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

Postman的高级用法—Runner的使用​

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

spring如何进行依赖注入,通过set方法把Dao注入到serves

1、选择Generate右键鼠标 你在service层后面方法的这些: 2、UserService配置文件的写法是怎样的&#xff1a; 3、我们在UserController中执行一下具体写法&#xff1a; 最后我们执行一下 &#xff1a; 4、这里可能出现空指针&#xff0c;因为你当前web层,因为你new这个对象根…...

Python使用图像处理库PIL(Python Imaging Library)和NumPy库来比较两副图像的相似度

目录 1、解释说明&#xff1a; 2、使用示例&#xff1a; 3、注意事项&#xff1a; 1、解释说明&#xff1a; 在Python中&#xff0c;我们可以使用图像处理库PIL&#xff08;Python Imaging Library&#xff09;和NumPy库来比较两副图像的相似度。常用的图像相似度计算方法有…...

clickhouse扩缩容

一、背景 我们之前已经学会了搭建clickhouse集群&#xff0c;我们搭建的是一套单分片两副本的集群&#xff0c;接下来我们来测试下clickhouse的扩缩容情况 二、扩容 扩容相对来说比较简单&#xff0c;我们原来的架构如下 hostshardreplica192.169.1.111192.169.1.212 现在…...

动漫3D虚拟人物制作为企业数字化转型提供强大动力

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

数据同步工具比较:选择适合您业务需求的解决方案

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

Python中数据结构列表详解

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

引领行业高质量发展|云畅科技参编《低代码开发平台创新发展路线图(2023)》

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

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...