三维重建小有基础入门之特征点检测基础

news2024/10/3 0:22:58
前言:本文将从此篇开始,记录自己从普通CVer入门三维重建的学习过程,可能过程比较坎坷,都在摸索阶段,但争取每次学习都能进一步,提高自己的能力,同时,每篇文章都会按情况相应地推出B站讲解视频,可以关注up 出门吃三碗饭 观看讲解视频,文章同步更新到公众号 AI知识物语 ,大家可以关注下助助力。另外本平台的评论私信不会看,有问题可以移步B站视频评论区or私信。
最后感谢相关博主,开源社区,github等对内容的贡献,也希望各位读者在读完后能有自己的收获,并且写文章分享自己的心得,希望这个社区越做越好。
个人对于该研究的展望以及背景:对我选择这个领域最大的感受是《头号玩家》电影,里面的画面我始终抱有着在不久地未来将会商业落地的期许。同时,XR(AR,VR)元宇宙、数字藏品等概念爆火,体现了虚拟场景相关的市场有极大的潜力。虽然目前三维重建相关方面的上市企业大部分是车企相关(基于自己调查的数据),做slam、点云方面的工作(应该是无人驾驶),一些近几年比较新的公司我看到有做虚拟偶像(也属于虚拟内容)等三维重建方面的工作(并不局限三维重建,还会融和动作捕捉等等其他cv技术)。
另外我最惊讶的是 Alex Yu在2022年,当时应该在UCB读大四时候基于最初Nerf提出的Plenoxels模型,并展示在CVPR上,后面有关注到他结合自己的论文算法,和导师创建了 LumaAI公司,使用Nerf技术去实现移动端的三维重建(拍照可以实现),目前只支持IOS系统。虽然其使用,交互设计,或者盈利模式还不是特别成熟,但我相信在不久的未来,该项技术能够很好地提高社会的生产力,为人们提供更好的生活服务。

LumaAI公司Nerf 三维建模产品链接

好,就唠嗑到这里了!让我们开始讲内容吧。任务伟大的成就、梦想,离不开一项项基础技术的支持。所以我们得脚踏实地去学习。

(一)Harris角点检测

什么是角点:

(1)轮廓间交点
(2)视角变化,也能检测到的点(比如我在角度X可以看到角点A,那么移动后,在角度Y需要也能看到角点A)
(3)角点附近像素点梯度变化大,通俗来看,就是附近不平滑,或者颜色差异大

基本思想:以每个点为中心取固定窗口并在图像上任意方向滑动,比较滑动前后像素灰度变化,若变化大,则存在角点。

数学逻辑:先来看图,和角点检测的公式

在这里插入图片描述
在一张图片上,我们取一个点,并以他为中心取一个正方形框,作为检测区域。
在这里插入图片描述

公式和图里的符号的含义:

(1)[u,v] 是窗口偏移量,也就是移动方向 ,E代表灰度变化。E[u,v]就表示窗口偏移前后的灰度变化值
(2)公式 Σ 对每一个点都进行计算
(3)w(x,y)表示权重,可以设为全是1,那么所有像素点的贡献都是一样的。如果设为高斯权重,那么距离该点越近,其贡献越大
(4)I(x,y)表示取起点的像素,I(x+u,y+v)下一个点的像素。这里对两个像素取了平方差,这样的好处可以避免差值为负数,取绝对值也可以有相同的效果,平方差用得比较多,梯度下降里面平方差用得也挺多。
总得公式用语言来表达:
窗口移动前后变化差值 = 每个点逐次计算[每个点的权重 * 点移动前后像素平方差 ]
(5)第一步到第二步的方式是通过泰勒展开(只需一阶展开即可),属于大学里高数的一般知识,不用慌,一开始慢慢看
泰勒展开参考文章
(6)对第二步进行化简,可以得到第三步的公式,这部分比较困难,我们一一来看。首先引入2个公式
在这里插入图片描述
把图像的梯度公式代入 第二行式子可以求得最终第三行的式子。
在这里插入图片描述
基于已经计算好的第3个式子,如上图一样进一步化简得出 E(u,v)关于λ1 和λ2的式子。 因为上图其化简格式像一个椭圆,为了更好地观察函数图像,不防把 E(u,v)设置为1,。如下图图像
在这里插入图片描述
在这里插入图片描述
根据上面的式子可以知道,椭圆的两边长 如蓝色的图里表示。
当λ1,λ2越大的时候,图像上可以看到椭圆上下和左右都会变得很窄,也就体现了实际检测的图片该区域梯度变化快,前后差异值大。如果λ1,λ2都接近0,其根号的倒数趋近于无穷大,那么这个椭圆会很宽,也就体现了实际检测的图片该区域梯度变化慢,不是位于角点区域,可以认为其区域相对平滑。

到这里可以看到λ1,λ2的巨大作用和直观表达性,那如何对其求解?

这里引入角点准则公式

在这里插入图片描述
角点检测算法实际上是对函数C进行阈值处理,C >threshold,取C的局部最大值。
这种算法容易造成响应的角点有可能会密集地集中在一小块区域,会造成计算的浪费,效率的降低。因此引入了 非极大值抑制,通过选取 上述一小块区域的 “局部响应最大值”,来避免重复的检测。

现在我们来回顾下整个的算法流程

在这里插入图片描述
(一)首先我们根据移动向量[u,v]来计算图像移动时的梯度变化
(二)移动过程中每个像素代入公式,计算其Harris矩阵的值为H
(三,四)把H代入角点准则公式,当返回C的值大于一定的值的时候,把其设置为角点

代码:

简单介绍下使用的函数
(1)dst = cv.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
该功能在图像上运行Harris角检测器。
参数:
      src: 输入单通道8位或浮点图像。
      blockSize:它是考虑进行角点检测的邻域的大小
      ksize:滑动核的大小。
      k:角点响应值R计算公式中的α。
    返回:
      dst: 用于存储哈里斯探测器响应的图像。它的类型为CV_32FC1,大小与src相同。
(2)dst = cv.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
  通过使用特定的结构元素来放大图像。该函数使用指定的结构化元素来扩展源图像,该结构化元素确定在其上获取最大值的像素邻域的形状。
  参数:
      src: 输入图像;通道数可以是任意的,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
      kernel:用于扩张的结构元素;如果elemenat = Mat(),则使用3 x 3的矩形结构元素。
      anchor: 锚在元素内的位置;默认值(-1,-1)表示锚点位于元素中心。
      iterations:进行扩张的次数。
    返回:
      dst: 输出与src大小和类型相同的图像。
代码参考文章

import numpy as np
import cv2 as cv
filename = 'test_image/test_chessboard.jpg'
img = cv.imread(filename)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv.cornerHarris(gray,2,3,0.04)
#result is dilated for marking the corners, not important
dst = cv.dilate(dst,None)
# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.01*dst.max()]=[0,0,255]
cv.imshow('dst',img)
if cv.waitKey(0) & 0xff == 27:
    cv.destroyAllWindows()

在这里插入图片描述

第一小篇章到这里就先结束了,后序其实还有很多知识点,但因笔者数学功底不好,还未消化,所以迟迟未落笔。后续会继续更新相关方面的文章,从基础特征点检测,到sfm,稠密重建,点云网格重建等等。另外有时间会超出视频版的讲解,可以关注B站 出门吃三碗饭 以及公众号 AI知识物语 。另外如果文章有问题,不足之处,欢迎指出,谢谢观看。

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

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

相关文章

一文搞懂core-scheduling核心机制

cookie的原理借助于unsigned long型,和refcount_t引用计数器。 32位64位char *4字节8字节unsigned long4字节8字节 数据结构修改 首先看看实现core scheduling功能对数据结构有哪些修改 task_struct struct task_struct{struct rb_node core_node;unsigned long…

Downie4.6.7

Downie是Mac下一个简单的下载管理器,可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们,文章末尾附下载地址。主要特点支持许多网站目前支持超过1,000个不同的网站(包括YouTube,Vim…

06 OpenCV‘阈值处理、自适应处理与ostu方法

1 基本概念 CV2中使用阈值的作用是将灰度图像二值化,即将灰度图像的像素值根据一个设定的阈值分成黑白两部分。阈值处理可以用于图像分割、去除噪声、增强图像对比度等多个领域。例如,在物体检测和跟踪中,可以通过对图像进行阈值处理来提取目…

回收站清空了还能找回来吗?回收站恢复的4个方法(最全)

回收站作为一个数据回收的地方,可以保存已删除的文件很久,直到用户手动永久删除这些数据,这为用户避免了许多数据丢失的问题。但是回收站数据过多,难免会影响电脑的运行速度。为此,我们都会定期进行清理。 清理过程中…

LeetCode 92. 反转链表 II

原题链接 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给你单链表的头指针 headheadhead 和两个整数 leftleftleft 和 rightrightright &#xff0c;其中 left<rightleft < rightleft<right 。请你反转从位置 leftleftleft 到位置 rightrightrig…

Scala 入门(第一章Scala 环境搭建、插件的安装)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 第 1 章 Scala 入门1.1 概述1.1.1 为什么学习 Scala1.1.2 Scala 发展历史1.1.3 Scala 和 Java 关系1.1.4 Scala 语言特点1.2 Scala 环境搭建1.3 Scala 插件安装1.4 HelloWorl…

Web 容器、HTTP 服务器 、Servlet 容器区别与联系

首先浏览器发起 HTTP 请求&#xff0c;像早期的时候只会请求一些静态资源&#xff0c;这时候需要一个服务器来处理 HTTP 请求&#xff0c;并且将相应的静态资源返回。 这个服务器叫 HTTP 服务器。 简单点说就是解析请求&#xff0c;然后得知需要服务器上面哪个文件夹下哪个名字…

三【mybatis的批量删除】

目录一 .批量删除的流程1.1 快速创建实体类1.1.1 创建完毕后 除了属性 其他内容进行删除1.2 创建mapper接口的抽象方法1.3 编写sql语句1.4 测试类Arrays.asList(删除对应的 id 值)运行结果✅作者简介&#xff1a;Java-小白后端开发者 &#x1f96d;公认外号&#xff1a;球场上的…

C语言指针剖析(初阶) 最详细!

什么是指针&#xff1f;指针和指针类型野指针指针运算指针和数组二级指针指针数组什么是指针&#xff1f;指针是内存中一个最小单元的编号&#xff0c;也就是地址。1.把内存划分为一个个的内存单元&#xff0c;一个内存单元的大小是一个字节。2.每个字节都给定唯一的编号&#…

GEE学习笔记九十一:栅格影像叠置分析

最近发现好多人都在问一个问题&#xff0c;两张影像如何取其相交区域&#xff1f;其实这个问题简单来讲就是多张栅格影像进行叠加分析。在GEE中栅格影像不像矢量数据那样有直接的函数来做数据分析&#xff0c;需要我们自己手动写一些代码来实现这些操作。要实现这个功能有很多方…

微信怎么开小店?【企业商家微信开店】

企业商家入局微信做营销已经是经营规划中必须做的一件事了&#xff0c;对于企业商家来说&#xff0c;最简单直接的方式就是开一个微信小店&#xff0c;然后通过自己宣传推广来在微信小店中成商品。那么企业商家在微信怎么开小店呢&#xff1f;下面内容分享给想在微信开店的企业…

滑块连杆模型仿真(含三菱ST+博途SCL计算源代码)

由滑块位置逆计算曲柄角度,请参看下面的文章链接,这篇博客主要计算由曲柄转动角度计算滑块位置。 https://blog.csdn.net/m0_46143730/article/details/128943228https://blog.csdn.net/m0_46143730/article/details/128943228简单的看下连杆滑块模型 模型的数学推导过程,大…

跨境电商新形式下,如何选择市场?

2022年&#xff0c;全球经济已经有增长乏力、通胀高起的趋势&#xff0c;美国等国家的通货膨胀情况令人担忧&#xff0c;不少行业面临更为复杂的外部环境以及严峻的市场挑战。不过&#xff0c;跨境电商行业依旧保持着较高的增长速度&#xff0c;越来越多有远见的卖家将电商事业…

C++之RALL机制

RALL是Resource acquisition is initialization的缩写&#xff0c;意思是“资源获取即初始化”&#xff0c;其核心思想是利用C对象生命周期的概念来控制程序的资源。它的技术原理很简单&#xff0c;如果希望对某个重要资源进行跟踪&#xff0c;那么创建一个对象&#xff0c;并将…

C语言之结构体内存的计算

结构体的内存 一.提出疑问 结构体占用的是一片连续的内存空间&#xff0c;大小是由成员变量的类型决定的。但并不是计算所有成员变量的类型大小之和那么简单。 先举一个实例&#xff1a; struct student {int age; //4个字节int telephone; //4个字节 }; int main() {struc…

如何用P6软件编制项目进度计划(下)

卷首语 根据项目合同包含的工作范围进行工作分解&#xff08;WBS&#xff09;&#xff0c;按照业主的要求及项目管理的需要&#xff0c;考虑不同阶段和层次&#xff0c;适时编制出项目管理所要求的的各级进度计划。 4搜集项目计划与进度控制相关信息 搜集与项目计划编制与进…

IP地址在金融行业有哪些应用?

中国加入WTO以来经济得到迅速发展&#xff0c;金融行业随着经济发展体系越来越完善。随着西方金融公司和理念的加入中国金融行业开始多样化发展。金融行业在快速发展的同时也引发了许多弊端。如何维护挖掘客户更大需求&#xff1f;如何获取更多优质客户&#xff1f;如何提升网络…

使用netty+springboot打造的tcp长连接通讯方案

文章目录项目背景正文一、项目架构二、项目模块三、业务流程四、代码详解1.消息队列2.执行类3.客户端五、测试六、源码后记项目背景 最近公司某物联网项目需要使用socket长连接进行消息通讯&#xff0c;捣鼓了一版代码上线&#xff0c;结果BUG不断&#xff0c;本猿寝食难安&am…

大公司如何用A/B测试解决增长问题?

摘要&#xff1a;上线六年&#xff0c;字节跳动的短视频产品——抖音已成为许多人记录美好生活的平台。除了抖音&#xff0c;字节跳动旗下还同时运营着数十款产品&#xff0c;从资讯、游戏&#xff0c;到房产、教育等横跨多个领域。在产品迭代速度和创新能力的快速发展下&#…

AcWing语法基础课笔记 第三章 C++中的循环结构

第三章 C中的循环结构 学习编程语言语法是次要的&#xff0c;思维是主要的。如何把头脑中的想法变成简洁的代码&#xff0c;至关重要。 ——闫学灿 学习循环语句只需要抓住一点——代码执行顺序&#xff01; while循环 可以简单理解为循环版的if语句。If语句是判断一次&#xf…