DS-SLAM 运动一致性检测的源码解读

运动一致性检测是Frame.cc的Frame::ProcessMovingObject(const cv::Mat &imgray)函数。

对应DS-SLAM流程图Moving consistency check的部分 

把这个函数单独摘出来,写了一下对两帧检测,查看效果的程序:

#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/video/tracking.hpp>
#include <vector>
#include <iostream>
#include <cmath>
void ProcessMovingObject(const  cv::Mat &img1, cv::Mat &img2, std::vector<cv::Point2f> F_prepoint,std::vector<cv::Point2f> F_nextpoint)
{cv::Mat prevGray, imgray;cv::cvtColor(img1, prevGray, cv::COLOR_BGR2GRAY);cv::cvtColor(img2, imgray, cv::COLOR_BGR2GRAY);std::vector<cv::Point2f> prepoint, nextpoint ;std::vector<cv::Point2f> F2_prepoint, F2_nextpoint ,T_M;double limit_dis_epi = 3; double limit_of_check = 2000;int limit_edge_corner = 5;std::vector<uchar> state;std::vector<float> err;// Detect dynamic target and ultimately optput the T matrixcv::goodFeaturesToTrack(prevGray, prepoint, 1000, 0.01, 8, cv::Mat(), 3, true, 0.04);cv::cornerSubPix(prevGray, prepoint, cv::Size(10, 10), cv::Size(-1, -1), cv::TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03));cv::calcOpticalFlowPyrLK(prevGray, imgray, prepoint, nextpoint, state, err, cv::Size(22, 22), 5, cv::TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.01));// 绘制特征点for (size_t i = 0; i < prepoint.size(); ++i) {cv::circle(img1, prepoint[i], 2, cv::Scalar(0, 255, 0), -1); // 绿色实心圆, 半径为2}// 显示绘制后的图像cv::imshow("Image with Feature Points", img1);for (int i = 0; i < state.size(); i++){if(state[i] != 0){int dx[10] = { -1, 0, 1, -1, 0, 1, -1, 0, 1 };int dy[10] = { -1, -1, -1, 0, 0, 0, 1, 1, 1 };int x1 = prepoint[i].x, y1 = prepoint[i].y;int x2 = nextpoint[i].x, y2 = nextpoint[i].y;if ((x1 < limit_edge_corner || x1 >= imgray.cols - limit_edge_corner || x2 < limit_edge_corner || x2 >= imgray.cols - limit_edge_corner|| y1 < limit_edge_corner || y1 >= imgray.rows - limit_edge_corner || y2 < limit_edge_corner || y2 >= imgray.rows - limit_edge_corner)){state[i] = 0;continue;}double sum_check = 0;for (int j = 0; j < 9; j++)sum_check += abs(prevGray.at<uchar>(y1 + dy[j], x1 + dx[j]) - imgray.at<uchar>(y2 + dy[j], x2 + dx[j]));if (sum_check > limit_of_check) state[i] = 0;if (state[i]){F_prepoint.push_back(prepoint[i]);F_nextpoint.push_back(nextpoint[i]);}}}// F-Matrixcv::Mat mask = cv::Mat(cv::Size(1, 300), CV_8UC1);cv::Mat F = cv::findFundamentalMat(F_prepoint, F_nextpoint, mask, cv::FM_RANSAC, 0.1, 0.99);for (int i = 0; i < mask.rows; i++){if (mask.at<uchar>(i, 0) == 0);//waidianelse{// Circle(pre_frame, F_prepoint[i], 6, Scalar(255, 255, 0), 3);double A = F.at<double>(0, 0)*F_prepoint[i].x + F.at<double>(0, 1)*F_prepoint[i].y + F.at<double>(0, 2);double B = F.at<double>(1, 0)*F_prepoint[i].x + F.at<double>(1, 1)*F_prepoint[i].y + F.at<double>(1, 2);double C = F.at<double>(2, 0)*F_prepoint[i].x + F.at<double>(2, 1)*F_prepoint[i].y + F.at<double>(2, 2);double dd = fabs(A*F_nextpoint[i].x + B*F_nextpoint[i].y + C) / sqrt(A*A + B*B); //Epipolar constraintsif (dd <= 0.1){F2_prepoint.push_back(F_prepoint[i]);F2_nextpoint.push_back(F_nextpoint[i]);}}}// zhixianshi neidian F_prepoint = F2_prepoint;F_nextpoint = F2_nextpoint;for (int i = 0; i < prepoint.size(); i++){if (state[i] != 0){double A = F.at<double>(0, 0)*prepoint[i].x + F.at<double>(0, 1)*prepoint[i].y + F.at<double>(0, 2);double B = F.at<double>(1, 0)*prepoint[i].x + F.at<double>(1, 1)*prepoint[i].y + F.at<double>(1, 2);double C = F.at<double>(2, 0)*prepoint[i].x + F.at<double>(2, 1)*prepoint[i].y + F.at<double>(2, 2);double dd = fabs(A*nextpoint[i].x + B*nextpoint[i].y + C) / sqrt(A*A + B*B);// Judge outliersif (dd <= limit_dis_epi) continue;  // inelse{T_M.push_back(nextpoint[i]);}for (size_t i = 0; i < T_M.size(); ++i) {cv::circle(img2, T_M[i], 2, cv::Scalar(255, 0, 0), -1); // blue实心圆, 半径为2}}}// 绘制光流矢量cv::Mat flowImg;cv::cvtColor(img2, flowImg, cv::COLOR_BGRA2BGR); // 复制以绘制for (size_t i = 0; i < F_prepoint.size(); ++i) {if (state[i]) {cv::line(flowImg, F_prepoint[i], F_nextpoint[i], cv::Scalar(0, 0, 255), 2);cv::circle(flowImg, F_nextpoint[i], 2, cv::Scalar(0, 255, 0), -1);}}// 显示结果cv::imshow("Optical Flow", flowImg);}
int main(int argc, char** argv) {if (argc < 3) {std::cerr << "Usage: " << argv[0] << " <image1_path> <image2_path>" << std::endl;return -1;}// 读取图片cv::Mat img1 = cv::imread(argv[1]);cv::Mat img2 = cv::imread(argv[2]);if (img1.empty() || img2.empty()) {std::cerr << "Could not open or find the images!" << std::endl;return -1;}// 存储用于LK光流的点std::vector<cv::Point2f> points1, points2;ProcessMovingObject(img1, img2, points1, points2 );// 等待按键cv::waitKey(0);return 0;
}

编译运行:

g++ -o main1 main1.cpp `pkg-config --cflags --libs opencv`
./main1 image1.jpg image3.jpg

(1)光流跟踪效果。 

(2) RANSANC求基础矩阵并去除外点,然后去除不符合对极约束的点。

自己调了一下阈值:

(3) 把不符合对极约束的点用蓝色表示。

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

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

相关文章

安全测试的全面知识体系及实现路径

以下是安全测试的全面知识体系及实现路径,结合最新工具和技术趋势(截至2025年): 一、安全测试核心类型与工具 1. 静态应用安全测试(SAST) 知识点: 通过分析源代码、字节码或二进制文件识别漏洞(如SQL注入、缓冲区溢出)支持早期漏洞发现,减少修复成本,适合白盒测试场…

GPT-4o Image Generation Capabilities: An Empirical Study

GPT-4o 图像生成能力:一项实证研究 目录 介绍研究背景方法论文本到图像生成图像到图像转换图像到 3D 能力主要优势局限性与挑战对比性能影响与未来方向结论介绍 近年来,图像生成领域发生了巨大的变化,从生成对抗网络 (GAN) 发展到扩散模型,再到可以处理多种模态的统一生成架…

Redis之全局唯一ID

全局ID生成器 文章目录 全局ID生成器一、全局ID生成器的定义定义核心作用 二、全局ID生成器需满足的特征1. 唯一性&#xff08;Uniqueness&#xff09;​2. 高性能&#xff08;High Performance&#xff09;​3. 可扩展性&#xff08;Scalability&#xff09;​4. 有序性&#…

nginx中的代理缓存

1.缓存存放路径 对key取哈希值之后&#xff0c;设置cache内容&#xff0c;然后得到的哈希值的倒数第一位作为第一个子目录&#xff0c;倒数第三位和倒数第二位组成的字符串作为第二个子目录&#xff0c;如图。 proxy_cache_path /xxxx/ levels1:2 2.文件名哈希值

静态时序分析STA——8.1 时序检查(建立时间检查)

文章目录 一、时序路径组二、建立时间检查1. 触发器到触发器路径1&#xff09;时钟单元UCKBUF0的延迟计算2&#xff09;时钟源延迟&#xff08;clock source latency&#xff09; 2. 输入到触发器路径1) 虚拟时钟的输入路径2) 具有实际时钟的输入路径 3. 触发器到输出路径4. 输…

了解高速设计的信号完整性仿真

高速设计需要精确的信号传输&#xff0c;以确保最佳性能。信号完整性差会导致关键应用中的误码、数据损坏甚至系统故障等问题。介电常数、损耗角正切和插入损耗等因素会显著影响信号质量。通过使用信号完整性仿真&#xff0c;您可以及早发现并解决这些挑战。这种主动方法有助于…

RAGFlowwindows本地pycharm运行

Python环境准备 1. 安装pipx。如已经安装&#xff0c;可跳过本步骤&#xff1a; python -m pip install --user pipxpython -m pipx ensurepath## 验证安装pipx --version2. 安装 uv。如已经安装&#xff0c;可跳过本步骤&#xff1a; pipx install uv ## 设置为阿里云 PyPI…

STM32-FreeRTOS的详细配置

配置FreeRTOS 原文链接&#xff1a;https://ydamooc.github.io/posts/c9defcd/ 1.1 下载FreeRTOS 打开FreeRTOS官网&#xff1a;https://www.freertos.org/ 点击下载&#xff0c;并且选择"FreeRTOS 202212.01"版本&#xff0c;再点击Download按钮下载官方的资源包…

Linux笔记---动静态库(原理篇)

1. ELF文件格式 动静态库文件的构成是什么样的呢&#xff1f;或者说二者的内容是什么&#xff1f; 实际上&#xff0c;可执行文件&#xff0c;目标文件&#xff0c;静态库文件&#xff0c;动态库文件都是使用ELF文件格式进行组织的。 ELF&#xff08;Executable and Linkable…

HVV-某田相关经历

一、背景 本次项目为期两周&#xff0c;由集团主导招募攻击队员对集团下属及其子公司进行的攻防演练。本次项目主导研判分析应急排查内部Nday发掘。 二、研判分析 2.1、帆软V10 漏洞概述 帆软 V10 及 V11 版本报表软件存在反序列化漏洞&#xff0c;攻击者可利用该漏洞使用…

AI与物联网的深度融合:开启智能生活新时代

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;和物联网&#xff08;IoT&#xff09;作为两大前沿技术&#xff0c;正在加速融合&#xff0c;为我们的生活和工作带来前所未有的变革。这种融合不仅提升了设备的智能化水平&#xff0c;还为各行各业带来了新的机…

Linux `init` 相关命令的完整使用指南

Linux init 相关命令的完整使用指南—目录 一、init 系统简介二、运行级别&#xff08;Runlevel&#xff09;详解三、常用 init 命令及使用方法1. 切换运行级别2. 查看当前运行级别3. 服务管理4. 紧急模式&#xff08;Rescue Mode&#xff09; 四、不同 Init 系统的兼容性1. Sy…

UNet 改进(12):UNet with ECA (Efficient Channel Attention) 网络

详解 下面将详细解析这个实现了ECA注意力机制的UNet网络代码。 1. 代码概述 代码实现了一个带有Efficient Channel Attention (ECA)模块的UNet网络架构。 UNet是一种常用于图像分割任务的编码器-解码器结构网络,而ECA模块则是一种轻量级的通道注意力机制,可以增强网络对重…

视频监控EasyCVR视频汇聚平台接入海康监控摄像头如何配置http监听功能?

一、方案概述 本方案主要通过EasyCVR视频管理平台&#xff0c;实现报警信息的高效传输与实时监控。海康监控设备能通过HTTP协议将报警信息发送至指定的目的IP或域名&#xff0c;而EasyCVR平台则可以接收并处理这些报警信息&#xff0c;同时提供丰富的监控与管理功能&#xff0…

人工智能与网络安全:AI如何预防、检测和应对网络攻击?

引言&#xff1a;网络安全新战场&#xff0c;AI成关键角色 在数字化浪潮不断推进的今天&#xff0c;网络安全问题已经成为每一家企业、每一个组织无法回避的“隐形战场”。无论是电商平台、金融机构&#xff0c;还是政府机关、制造企业&#xff0c;都可能面临数据泄露、勒索病毒…

3D人脸扫描技术如何让真人“进入“虚拟,虚拟数字人反向“激活“现实?

随着虚拟人技术的飞速发展&#xff0c;超写实数字人已经成为数字娱乐、广告营销和虚拟互动领域的核心趋势。无论是企业家、知名主持人还是明星&#xff0c;数字分身正在以高度还原的形象替代真人参与各类活动&#xff0c;甚至成为品牌代言、直播互动的新宠。 3D人脸扫描&#…

递归函数详解

定义 递归是指一个函数在其定义中直接或间接地调用自身的方法。通过这种方式&#xff0c;函数可以将一个复杂的问题分解为规模更小的、与原问题相似的子问题&#xff0c;然后通过不断地解决这些子问题来最终解决整个问题。 组成部分 递归主体 这是函数中递归调用自身的部分…

ASP.NET Core Web API 配置系统集成

文章目录 前言一、配置源与默认设置二、使用步骤1&#xff09;创建项目并添加配置2&#xff09;配置文件3&#xff09;强类型配置类4&#xff09;配置Program.cs5&#xff09;控制器中使用配置6&#xff09;配置优先级测试7&#xff09;动态重载配置测试8&#xff09;运行结果示…

在生信分析中,从生物学数据库中下载的序列存放在哪里?要不要建立一个小型数据库,或者存放在Gitee上?

李升伟 整理 在Galaxy平台中使用时&#xff0c;从NCBI等生物学数据库下载的DNA序列的存储位置和管理方式需要根据具体的工作流程和需求进行调整。以下是详细的分步说明和建议&#xff1a; 一、Galaxy中DNA序列的默认存储位置 在Galaxy的“历史记录”&#xff08;History&…

SDK游戏盾如何接入?复杂吗?

接入SDK游戏盾&#xff08;通常指游戏安全防护类SDK&#xff0c;如防DDoS攻击、防作弊、防外挂等功能&#xff09;的流程和复杂度取决于具体的服务商&#xff08;如腾讯云、上海云盾等&#xff09;以及游戏类型和技术架构。以下是一般性的接入步骤、复杂度评估及注意事项&#…