OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
无匹配
| 函数
从图像中提取的线条的二进制描述符

详细描述

简介

计算机视觉中最具挑战性的活动之一是从给定图像中提取有用信息。此类信息通常以点的形式出现,这些点保留某种属性(例如,它们是尺度不变的)并且实际上代表输入图像。

本模块的目标是在图像内部寻找一种新的代表性信息,并提供提取和表示该信息的函数。特别是,与以前在图像内部检测相关元素的方法不同,线代替点被提取;一个新的类专门定义来总结一条线的属性,以便于重复使用和绘制。

二进制描述符的计算

为了获得表示从图像的特定八度检测到的特定线的二进制描述符,我们首先计算一个非二进制描述符,如[315]中所述。此算法适用于使用 EDLine 检测器提取的线,如[288]中所述。给定一条线,我们考虑一个以其为中心的矩形区域,称为线支持区域 (LSR)。此区域被划分为一组带\(\{B_1, B_2, ..., B_m\}\),其长度等于线的长度。

如果我们用\(\bf{d}_L\)表示线的方向,则可以确定线的正交逆时针方向\(\bf{d}_{\perp}\);这两个方向用于构建以线的中点为中心的参考系。LSR 内部像素的梯度\(\bf{g'}\)可以投影到新确定的帧上,从而获得其局部等效\(\bf{g'} = (\bf{g}^T \cdot \bf{d}_{\perp}, \bf{g}^T \cdot \bf{d}_L)^T \triangleq (\bf{g'}_{d_{\perp}}, \bf{g'}_{d_L})^T\)。

后来,高斯函数被应用于 LSR 的所有像素,沿\(\bf{d}_\perp\)方向;首先,我们将全局加权系数\(f_g(i) = (1/\sqrt{2\pi}\sigma_g)e^{-d^2_i/2\sigma^2_g}\)分配给 LSR 中的第 i 行,其中\(d_i\)是第 i 行与 LSR 中中心行的距离,\(\sigma_g = 0.5(m \cdot w - 1)\),而 \(w\) 是带的宽度(对每个带都相同)。其次,考虑到一个带 \(B_j\) 及其相邻带 \(B_{j-1}, B_{j+1}\),我们分配一个局部加权\(F_l(k) = (1/\sqrt{2\pi}\sigma_l)e^{-d'^2_k/2\sigma_l^2}\),其中\(d'_k\)是第 k 行与 \(B_j\) 中中心行的距离,而\(\sigma_l = w\)。使用全局和局部权重,我们同时减少了远离线的梯度所起的作用以及边界效应。

LSR 中的每个带 \(B_j\) 都与一个相关的带描述符 (BD) 相关联,该描述符是通过考虑前一个和下一个带(计算第一个和最后一个带的描述符时忽略顶部和底部带)来计算的。一旦每个带都被分配了其 BD,线的 LBD 描述符就简单地由以下公式给出

\[LBD = (BD_1^T, BD_2^T, ... , BD^T_m)^T.\]

要计算一个带描述符 \(B_j\),考虑其中的每条第 k 行,并将该行中的梯度累积起来

\[\begin{matrix} \bf{V1}^k_j = \lambda \sum\limits_{\bf{g}'_{d_\perp}>0}\bf{g}'_{d_\perp}, & \bf{V2}^k_j = \lambda \sum\limits_{\bf{g}'_{d_\perp}<0} -\bf{g}'_{d_\perp}, \\ \bf{V3}^k_j = \lambda \sum\limits_{\bf{g}'_{d_L}>0}\bf{g}'_{d_L}, & \bf{V4}^k_j = \lambda \sum\limits_{\bf{g}'_{d_L}<0} -\bf{g}'_{d_L}\end{matrix}.\]

其中\(\lambda = f_g(k)f_l(k)\)。

通过堆叠先前的结果,我们得到了带描述矩阵 (BDM)

\[BDM_j = \left(\begin{matrix} \bf{V1}_j^1 & \bf{V1}_j^2 & \ldots & \bf{V1}_j^n \\ \bf{V2}_j^1 & \bf{V2}_j^2 & \ldots & \bf{V2}_j^n \\ \bf{V3}_j^1 & \bf{V3}_j^2 & \ldots & \bf{V3}_j^n \\ \bf{V4}_j^1 & \bf{V4}_j^2 & \ldots & \bf{V4}_j^n \end{matrix} \right) \in \mathbb{R}^{4\times n},\]

其中 \(n\) 是带 \(B_j\) 中的行数

\[n = \begin{cases} 2w, & j = 1||m; \\ 3w, & \mbox{else}. \end{cases}\]

每个 \(BD_j\) 可以使用 \(BDM_J\) 的标准差向量 \(S_j\) 和均值向量 \(M_j\) 来获得。因此,最后

\[LBD = (M_1^T, S_1^T, M_2^T, S_2^T, \ldots, M_m^T, S_m^T)^T \in \mathbb{R}^{8m}\]

获得 LBD 后,必须将其转换为二进制形式。为此,我们考虑其中的 32 个可能的 BD 对;将每对 BD 逐位比较,比较会生成一个 8 位字符串。将 32 个比较字符串连接起来,我们得到单个 LBD 的 256 位最终二进制表示。

类  cv::line_descriptor::BinaryDescriptor
 此类实现了检测线条及其二进制描述符的计算功能。 更多...
 
类  cv::line_descriptor::BinaryDescriptorMatcher
 提供所有功能来查询用户提供或类内部的(用户必须填充)数据集,遵循描述符匹配器的模式。 更多...
 
结构  cv::line_descriptor::DrawLinesMatchesFlags
 
结构  cv::line_descriptor::KeyLine
 一个表示线的类。 更多...
 
类  cv::line_descriptor::LSDDetector
 
结构  cv::line_descriptor::LSDParam
 

函数

void cv::line_descriptor::drawKeylines (const Mat &image, const std::vector< KeyLine > &keylines, Mat &outImage, const Scalar &color=Scalar::all(-1), int flags=DrawLinesMatchesFlags::DEFAULT)
 绘制关键线。
 
void cv::line_descriptor::drawLineMatches (const Mat &img1, const std::vector< KeyLine > &keylines1, const Mat &img2, const std::vector< KeyLine > &keylines2, const std::vector< DMatch > &matches1to2, Mat &outImg, const Scalar &matchColor=Scalar::all(-1), const Scalar &singleLineColor=Scalar::all(-1), const std::vector< char > &matchesMask=std::vector< char >(), int flags=DrawLinesMatchesFlags::DEFAULT)
 绘制从两幅图像中找到的关键线的匹配。
 

函数文档

◆ drawKeylines()

void cv::line_descriptor::drawKeylines ( const Mat image,
const std::vector< KeyLine > &  keylines,
Mat outImage,
const Scalar color = Scalar::all(-1),
int  flags = DrawLinesMatchesFlags::DEFAULT 
)
Python
cv.line_descriptor.drawKeylines(image, keylines[, outImage[, color[, flags]]]) -> outImage

#include <opencv2/line_descriptor/descriptor.hpp>

绘制关键线。

参数
image输入图像
keylines要绘制的关键线
outImage要绘制的输出图像
color要绘制的线的颜色(如果设置为默认值,则随机选择颜色)
flags绘制标志

◆ drawLineMatches()

void cv::line_descriptor::drawLineMatches ( const Mat img1,
const std::vector< KeyLine > &  keylines1,
const Mat img2,
const std::vector< KeyLine > &  keylines2,
const std::vector< DMatch > &  matches1to2,
Mat outImg,
const Scalar matchColor = Scalar::all(-1),
const Scalar singleLineColor = Scalar::all(-1),
const std::vector< char > &  matchesMask = std::vector< char >(),
int  flags = DrawLinesMatchesFlags::DEFAULT 
)
Python
cv.line_descriptor.drawLineMatches(img1, keylines1, img2, keylines2, matches1to2[, outImg[, matchColor[, singleLineColor[, matchesMask[, flags]]]]]) -> outImg

#include <opencv2/line_descriptor/descriptor.hpp>

绘制从两幅图像中找到的关键线的匹配。

参数
img1第一张图像
keylines1从第一张图像中提取的关键线
img2第二张图像
keylines2从第二张图像中提取的关键线
matches1to2匹配向量
outImg要绘制的输出矩阵
matchColor匹配的绘制颜色(如果为默认值,则随机选择)
singleLineColor关键线的绘制颜色(如果为默认值,则随机选择)
matchesMask掩码,用于指示哪些匹配必须绘制
flags绘制标志,请参见 DrawLinesMatchesFlags
注意
如果matchColorsingleLineColor 都设置为其默认值,则函数会绘制匹配的线,并使用相同的颜色绘制连接它们的线