OpenCV 4.13.0
開源計算機視覺庫 (Open Source Computer Vision)
正在載入...
正在搜尋...
未找到匹配項
用於從影像中提取的線條的二進位制描述符

詳細說明

引言

計算機視覺中最具挑戰性的任務之一是從給定影像中提取有用的資訊。這些資訊通常以點(例如,它們是尺度不變的)的形式出現,並且實際上代表了輸入影像。

本模組的目標是在影像中尋找一種新的代表性資訊,並提供其提取和表示的功能。特別是,與以前在影像中檢測相關元素的方法不同,這裡提取的是線而不是點;定義了一個新的類來彙總線的屬性,用於重用和繪圖目的。

二進位制描述符的計算

為了獲得代表從影像某個八度中檢測到的特定線的二進位制描述符,我們首先按照[321]中的描述計算一個非二進位制描述符。該演算法作用於使用EDLine檢測器提取的線,如[295]中所述。給定一條線,我們考慮一個以該線為中心的矩形區域,稱為線支援區域 (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\)。

之後,沿 \(\bf{d}_\perp\) 方向對LSR的所有畫素應用高斯函式;首先,我們為LSR中的第i行分配一個全域性權重係數 \(f_g(i) = (1/\sqrt{2\pi}\sigma_g)e^{-d^2_i/2\sigma^2_g}\),其中 \(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)
 繪製兩幅影像中找到的關鍵線匹配項。
 

函式文件 (Function Documentation)

◆ drawKeylines()

void cv::line_descriptor::drawKeylines ( const Mat & 影像,
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>

繪製關鍵線。

引數
影像輸入影像
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
注意
如果 `matchColor` 和 `singleLineColor` 都設定為其預設值,則函式將以相同的顏色繪製匹配的線以及連線它們的線。