詳細解釋aruco::markdetection _detectInitialCandidates函數

_detectInitialCandidates?是 OpenCV 的 ArUco 模塊中一個非常關鍵的函數,它負責檢測圖像中的候選 ArUco 標記。該函數的主要目標是:

  • 使用多個尺度(scale)對輸入圖像進行自適應閾值處理;
  • 在每個尺度下提取輪廓并篩選出符合要求的四邊形角點;
  • 將這些候選標記及其對應的輪廓保存到輸出參數中。

📌 函數簽名

static void _detectInitialCandidates(const Mat &grey,vector<vector<Point2f> > &candidates,vector<vector<Point> > &contours,const DetectorParameters &params)

參數說明:

參數名類型含義
greyconst Mat &輸入的灰度圖像
candidatesvector<vector<Point2f> > &輸出的候選標記角點(4個點組成的矩形)
contoursvector<vector<Point> > &輸出的與候選角點對應的完整輪廓信息
paramsconst DetectorParameters &檢測器參數,控制檢測過程的行為

🔍 功能詳解

1???設置自適應閾值窗口大小范圍

CV_Assert(params.adaptiveThreshWinSizeMin >= 3 && params.adaptiveThreshWinSizeMax >= 3);
CV_Assert(params.adaptiveThreshWinSizeMax >= params.adaptiveThreshWinSizeMin);
CV_Assert(params.adaptiveThreshWinSizeStep > 0);

確保傳入的參數合法:

  • 自適應閾值窗口最小和最大尺寸 ≥ 3(OpenCV 要求)
  • 步長必須大于 0

2???計算要使用的窗口大小數量(即圖像金字塔層數)

int nScales = (params.adaptiveThreshWinSizeMax - params.adaptiveThreshWinSizeMin) /params.adaptiveThreshWinSizeStep + 1;

根據設定的最小、最大窗口大小和步長,計算需要嘗試多少種不同的窗口大小。

例如:min=20,?max=40,?step=5?→?nScales = 5


3???為每種窗口大小準備容器

vector<vector<vector<Point2f> > > candidatesArrays((size_t) nScales);
vector<vector<vector<Point> > > contoursArrays((size_t) nScales);

  • candidatesArrays[i]:第 i 個窗口大小下的所有候選標記角點集合。
  • contoursArrays[i]:對應的所有輪廓。

4???多線程處理不同尺度(parallel_for_)

parallel_for_(Range(0, nScales), [&](const Range& range) {for (int i = begin; i < end; i++) {int currScale = params.adaptiveThreshWinSizeMin + i * params.adaptiveThreshWinSizeStep;Mat thresh;_threshold(grey, thresh, currScale, params.adaptiveThreshConstant);_findMarkerContours(thresh, candidatesArrays[i], contoursArrays[i],params.minMarkerPerimeterRate, params.maxMarkerPerimeterRate,params.polygonalApproxAccuracyRate, params.minCornerDistanceRate,params.minSideLengthCanonicalImg);}
});

對于每一個窗口大小:
  1. 調用?_threshold()?進行自適應閾值處理
    • 用于將圖像二值化,便于后續提取輪廓。
  2. 調用?_findMarkerContours()?提取輪廓并篩選出可能的 ArUco 標記角點
    • 篩選條件包括:周長范圍、是否為凸四邊形、角點距離等。

5???合并所有尺度的結果

for(int i = 0; i < nScales; i++) {for(unsigned int j = 0; j < candidatesArrays[i].size(); j++) {candidates.push_back(candidatesArrays[i][j]);contours.push_back(contoursArrays[i][j]);}
}

將不同尺度下檢測到的候選標記統一合并到最終輸出變量?candidates?和?contours?中。


🧠 關鍵輔助函數說明

??_threshold()

static void _threshold(InputArray _in, OutputArray _out, int winSize, double constant)
  • 使用?adaptiveThreshold()?對圖像進行自適應二值化。
  • 確保窗口大小為奇數。
  • 采用?ADAPTIVE_THRESH_MEAN_C?方法,反向二值化 (THRESH_BINARY_INV)。

??_findMarkerContours()

static void _findMarkerContours(const Mat &in,vector<vector<Point2f> > &candidates,vector<vector<Point> > &contoursOut,double minPerimeterRate,double maxPerimeterRate,double accuracyRate,double minCornerDistanceRate,int minSize)

這個函數負責從二值圖像中提取輪廓,并篩選出可能是 ArUco 標記的四邊形。

主要步驟:
  1. 查找所有輪廓

    findContours(in, contours, RETR_LIST, CHAIN_APPROX_NONE);
  2. 逐個輪廓篩選

    • 周長在指定范圍內;
    • 多邊形逼近后為凸四邊形;
    • 四個角點之間最小距離滿足要求;
    • 如果啟用 ArUco3 功能,則額外判斷最小邊長。
  3. 將符合條件的輪廓加入輸出

    • 角點存入?candidates
    • 完整輪廓存入?contoursOut

📈 總結流程圖

_detectInitialCandidates()
│
├─ 設置參數檢查
│
├─ 計算使用多少種窗口大小(nScales)
│
├─ 并行遍歷每個窗口大小:
│   ├─ 圖像二值化(_threshold)
│   └─ 提取并篩選候選標記(_findMarkerContours)
│       ├─ 查找輪廓
│       ├─ 篩選輪廓(凸四邊形、周長、角點距離等)
│       └─ 添加進臨時容器
│
└─ 合并所有窗口大小下的結果到輸出

🧰 參數影響分析(DetectorParameters)

參數名作用
adaptiveThreshWinSizeMin最小閾值窗口大小,決定最小可檢測標記大小
adaptiveThreshWinSizeMax最大閾值窗口大小,決定最大可檢測標記大小
adaptiveThreshWinSizeStep窗口大小遞增步長
minMarkerPerimeterRate最小周長比例(相對于圖像寬度/高度)
maxMarkerPerimeterRate最大周長比例
polygonalApproxAccuracyRate多邊形逼近精度比例
minCornerDistanceRate角點間最小距離比例
minSideLengthCanonicalImgArUco3 功能中最小邊長限制

📝 示例說明

假設你有如下代碼調用:

Mat grey = ...; // 輸入灰度圖
vector<vector<Point2f>> candidates;
vector<vector<Point>> contours;
DetectorParameters params = DetectorParameters::create();
_detectInitialCandidates(grey, candidates, contours, params);

這段代碼會:

  • 使用多個窗口大小對圖像進行自適應閾值;
  • 提取輪廓并篩選出潛在的 ArUco 標記;
  • 返回所有候選標記的四個角點坐標及其原始輪廓。

? 總結

特性描述
功能檢測圖像中所有可能的 ArUco 標記候選區域
輸入灰度圖像、檢測參數
輸出候選角點列表、對應輪廓列表
關鍵技術自適應閾值、輪廓檢測、多邊形逼近、幾何篩選
性能優化使用?parallel_for_?實現多線程加速
后續處理通常交給?_reorderCandidatesCorners()?排序角點順序

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86648.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86648.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86648.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android 開發中配置 USB 配件模式(Accessory Mode) 配件過濾器的配置

在 Android 開發中配置 USB 配件模式&#xff08;Accessory Mode&#xff09; 的配件過濾器&#xff08;accessory_filter.xml&#xff09;&#xff0c;需要以下步驟&#xff1a; 1. 創建配件過濾器文件 在項目的 res/xml/ 目錄下創建 accessory_filter.xml 文件&#xff08;若…

FreeRTOS互斥量

目錄 1.使用場合2.函數2.1 創建2.1.1 動態創建2.1.2 靜態創建 2.2 刪除2.3 釋放&#xff08;Give&#xff09;2.4 獲取&#xff08;Take&#xff09;2.5 ISR 版本注意事項 3.常規使用流程4.和二進制信號量的對比5.遞歸鎖5.1 死鎖5.2 概念5.2.1 問題5.2.2 解決方案&#xff1a;遞…

ThinkPad 交換 Ctrl 鍵和 Fn 鍵

概述 不知道那個大聰明設計的將fn設置在最左邊&#xff0c;xxx&#xff0c;我服了&#xff0c;你這個老六真惡心。 方法 一&#xff1a;BIOS/UEFI 設置&#xff08;推薦&#xff09; 重啟 你的 ThinkPad。 在啟動時按下 F1&#xff08;或 Enter&#xff0c;再按 F1&#xff0…

`dispatch_source_t` 計時器 vs `NSTimer`:核心差異一覽

維度GCD 計時器 (dispatch_source_t)NSTimer依賴機制直接掛在 GCD 隊列;底層走 Mach 內核定時源掛在 RunLoop,必須指定 RunLoop & mode線程上下文哪個隊列就在哪條線程回調(例中用 dispatch_get_main_queue())總在定時器所在的 RunLoop 線程(默認主線程 & NSDefau…

ubuntu22.04系統安裝部署docker和docker compose全過程!

更新系統包 首先&#xff0c;確保系統包是最新的&#xff1a; sudo apt updatesudo apt upgrade -y安裝依賴 安裝 Docker 所需的依賴包&#xff1a; sudo apt install -y apt-transport-https ca-certificates curl software-properties-common添加 Docker 官方 GPG 密鑰 添加…

企業如何增強終端安全?

在數字化轉型加速的今天&#xff0c;企業的業務運行越來越依賴于終端設備。從員工的筆記本電腦、智能手機&#xff0c;到工廠里的物聯網設備、智能傳感器&#xff0c;這些終端構成了企業與外部世界連接的 “神經末梢”。然而&#xff0c;隨著遠程辦公的常態化和設備接入的爆炸式…

VS2017----打開ui文件幾秒后閃退

問題描述 在vs2017中雙擊ui文件能夠打開,但是幾秒后就閃退了,提示報錯 問題解決 QT VS tools ----Options,把這個設置為True保存即可

深入解析Docker網橋模式:從docker0到容器網絡的完整通信鏈路

1. 簡介docker 網橋模式 Docker 啟動時默認創建 docker0 虛擬網橋&#xff08;Linux bridge&#xff09;&#xff0c;并分配私有 IP 地址范圍&#xff08;如 172.17.42.1/16&#xff09;&#xff0c;它的作用相當于一個虛擬交換機&#xff0c;讓宿主機和多個容器之間可以通信。…

Proof of Talk專訪CertiK聯創顧榮輝:全周期安全方案護航Web3生態

6月10日&#xff0c;CertiK聯合創始人兼CEO顧榮輝在Proof of Talk 2025舉辦期間&#xff0c;接受大會官方專訪&#xff0c;分享了他對Web3安全現狀的觀察以及CertiK的安全戰略布局。 顧榮輝指出&#xff0c;雖然安全的重要性被廣泛認可&#xff0c;但許多創業者和開發者仍存在…

再說一說LangChain Runnable接口

之前我們介紹過LangChain通過Runnable和LCEL來實現各個組件的快捷拼裝&#xff0c;整個過程就像拼積木一樣。 今天我們深入剖析Runnable接口的底層實現邏輯。 往期文章推薦: 16.Docker實戰&#xff1a;5分鐘搞定MySQL容器化部署與最佳實踐15.Ollama模板全解析&#xff1a;從基…

LLaMA-Factory微調Qwen3模型完了,怎么直接用vllm推理模型?

環境&#xff1a; LLaMA-Factory vllm0.8.5 Qwen3-8b 問題描述&#xff1a; LLaMA-Factory微調Qwen3模型完了,怎么直接用vllm推理模型&#xff1f; 解決方案&#xff1a; 一、合并 LoRA 權重與基礎模型 vLLM 需要完整的模型文件&#xff08;含合并后的權重&#xff09;…

C#AES加密

一、AES 加密概念 定義 &#xff1a;AES&#xff08;Advanced Encryption Standard&#xff0c;高級加密標準&#xff09;是一種對稱加密算法&#xff0c;由美國國家標準與技術研究院&#xff08;NIST&#xff09;于 2001 年發布&#xff0c;用于替代之前的 DES&#xff08;數據…

搞了兩天的win7批處理腳本問題

目錄 問題 原因&#xff1a; 經過各種對比 解決方法 問題 比如 echo "yes" | find /c /v "" 這個統計非空串的行數&#xff0c;在其它系統都是 1&#xff1b;但在win7里非正常的反應&#xff0c;為空。 原因&#xff1a; 在wvpCheckStart.bat 首…

手陽明大腸經之溫溜穴

個人主頁&#xff1a;云納星辰懷自在 座右銘&#xff1a;“所謂堅持&#xff0c;就是覺得還有希望&#xff01;” 溫溜又名&#xff1a; 1.《針灸甲乙經》&#xff1a;逆注、蛇頭。 2.《資生》&#xff1a;池頭。 所屬經絡&#xff1a;手陽明大腸經 定位 屈肘&#xff0c;在前臂…

傳統Web應用和RESTful API模式

傳統Web應用和RESTful API 傳統模式 傳統模式沒有實現前后端分離&#xff0c;服務器處理完業務后直接返回完整的HTML頁面&#xff0c;每次操作都要刷新整個頁面。類似下面的情況&#xff1a; Controller public class UserController {RequestMapping("/addUser")…

JS開發node包并發布流程

開發一個可發布到 npm 的 JavaScript 插件&#xff0c;需要遵循標準的開發、測試、打包和發布流程。以下是詳細步驟指南&#xff1a; 1. 初始化項目 創建項目目錄并初始化 package.json mkdir my-js-plugin cd my-js-plugin npm init -y手動修改 package.json&#xff0c;確保…

對比學習(Contrastive Learning)方法詳解

對比學習&#xff08;Contrastive Learning&#xff09;方法詳解 對比學習&#xff08;Contrastive Learning&#xff09;是一種強大的自監督或弱監督表示學習方法&#xff0c;其核心思想是學習一個嵌入空間&#xff0c;在這個空間中&#xff0c;相似的樣本&#xff08;“正樣…

1.6 http模塊nodejs 對比 go

我們以go語言 原生實現 和瀏覽器交互.到現在學習 nodejs http模塊. nodejs 對于請求分發,也需要我們自己處理. 我們應該也對 http 服務是建立在 tcp協議基礎上.有更深入的體會了吧. 對于我們之后 學習 java web容器. 能有更深入的認知. 請求分發 請求分發是指 Web 框架或服務器…

護照閱讀器在景區的應用

護照閱讀器在景區的應用可以顯著提升游客管理效率、增強安全性并優化游客體驗。以下是其主要應用場景、優勢及實施建議&#xff1a; 一、核心應用場景 快速入園核驗 自動身份識別&#xff1a;通過掃描護照芯片&#xff08;MRZ碼或NFC讀取&#xff09;&#xff0c;1-3秒完成身份…

Prompt Tuning、P-Tuning、Prefix Tuning的區別

一、Prompt Tuning、P-Tuning、Prefix Tuning的區別 1. Prompt Tuning(提示調優) 核心思想:固定預訓練模型參數,僅學習額外的連續提示向量(通常是嵌入層的一部分)。實現方式:在輸入文本前添加可訓練的連續向量(軟提示),模型只更新這些提示參數。優勢:參數量少(僅提…