從一組線段中得出四邊形的算法

原始的需求是使用OpenCV的直線檢測算法(例如LSD)之后,得到一組線段。然后需要從這些線段得到類似矩形的四邊形,用于檢測經過透視變換的矩形物體。這些線段不一定首尾相接,彼此之間可能相交或有一定距離。

以下是需求圖:

使用從線段中尋找四邊形的算法之后,得到了以下結果:

算法的步驟為:

1、從線段中挑出4條,順序不同的組合只有3種。

2、對于每一種組合,由于每一條線段都有2個方向,那么就會有8種組合。

3、對于每一個組合,首先檢查相鄰線段的夾角,排除太小或太大的(相對于90度)。

4、繼而檢查相鄰線段的頂點距離,排除距離太遠的。

5、最后,求出四條相鄰線段的交點,以這4個交點作為最終透視矩形的四個頂點。

算法代碼如下:

/// <summary>
/// 線段組成四邊形
/// </summary>
/// <param name="segs">線段列表</param>
/// <param name="maxDistSum">最大距離和</param>
/// <returns>四邊形列表</returns>
public static List<PolygonScore> FormQuadrangle(Segment2D[] segs, double maxDistSum)
{int len = segs.Length;List<int[]> combines = new List<int[]>();for (int i = 0; i < len - 3; i++){for (int j = i + 1; j < len - 2; j++){for (int k = j + 1; k < len - 1; k++){for (int l = k + 1; l < len; l++){combines.Add(new int[] { i, j, k, l });combines.Add(new int[] { i, j, l, k });combines.Add(new int[] { i, k, j, l });}}}}List<RectInfo> rects = new List<RectInfo>();for (int i = 0; i < combines.Count; i++){int[] combine = combines[i];var seg1 = segs[combine[0]];var seg2 = segs[combine[1]];var seg3 = segs[combine[2]];var seg4 = segs[combine[3]];double cos1 = CosAngle(seg1.Vec, seg1.Length, seg2.Vec, seg2.Length);if (Math.Abs(cos1) > 0.5){continue;}double cos2 = CosAngle(seg2.Vec, seg2.Length, seg3.Vec, seg3.Length);if (Math.Abs(cos2) > 0.5){continue;}double cos3 = CosAngle(seg3.Vec, seg3.Length, seg4.Vec, seg4.Length);if (Math.Abs(cos3) > 0.5){continue;}double cos4 = CosAngle(seg4.Vec, seg4.Length, seg1.Vec, seg1.Length);if (Math.Abs(cos4) > 0.5){continue;}var doubleSegs = new Segment2D[] { seg1, seg1.Reverse(), seg2, seg2.Reverse(), seg3, seg3.Reverse(), seg4, seg4.Reverse() };bool found = false;for (int i1 = 0; i1 < 2; i1++){for (int i2 = 2; i2 < 4; i2++){double d1 = PointPoint(doubleSegs[i1].P2, doubleSegs[i2].P1);if (d1 > maxDistSum){continue;}for (int i3 = 4; i3 < 6; i3++){double d2 = PointPoint(doubleSegs[i2].P2, doubleSegs[i3].P1) + d1;if (d2 > maxDistSum){continue;}for (int i4 = 6; i4 < 8; i4++){double d3 = PointPoint(doubleSegs[i3].P2, doubleSegs[i4].P1);double d4 = PointPoint(doubleSegs[i4].P2, doubleSegs[i1].P1);double dd = d2 + d3 + d4;if (dd < maxDistSum){rects.Add(new RectInfo(new Segment2D[] { doubleSegs[i1], doubleSegs[i2], doubleSegs[i3], doubleSegs[i4] }, dd));found = true;}if (found){break;}}if (found){break;}}if (found){break;}}if (found){break;}}}rects.Sort();List<PolygonScore> polygons = new List<PolygonScore>();foreach (RectInfo rect in rects){polygons.Add(new PolygonScore(new Point2D[] {Intersect(rect.Segments[0],rect.Segments[1]),Intersect(rect.Segments[1],rect.Segments[2]),Intersect(rect.Segments[2],rect.Segments[3]),Intersect(rect.Segments[3],rect.Segments[0])}, rect.DistSum));}return polygons;
}

使用上面的代碼對下圖進行簡單測試:

得到如下結果:

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

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

相關文章

提示詞Prompts(2)

摘要&#xff1a; 本文介紹了langchain.prompts中基礎的提示詞模板的高級用法&#xff0c;包括利用PipelinePrompt組合Prompt使用&#xff0c;多模態場景、動態占位符的使用等進行了介紹。 文章目錄 1. 背景2. PipelinePrompt2.1 組合兩個Prompt模板2.2 多模態模板 3. 聊天提示…

服務器代碼知識點補充

目錄 UdpServer: 觀察者模式: remove_if算法 管道補充: 文件的標準輸出 ,標準輸入,標準錯誤 UdpServer: 數據接收模塊關心Adduser 和Deleuser 兩個模塊 線程池關心Route模塊 將這三個方法注冊進服務器 ,但是有臨界區問題(線程池與數據接受模塊可能同時訪問用戶管理模塊,所…

R語言緩釋制劑QBD解決方案之二

藥物層優化研究 在藥物層工藝中水溶劑蒸發起到重要的作用。濕的環境會使丸子聚集&#xff0c;而干的環境影響藥物與MCC的粘合。輸入變量如氣流量&#xff0c;噴霧速率&#xff0c;霧化壓力&#xff0c;和產品溫度對MCC沉著和包衣溶劑蒸發的平衡有影響。進行了帶3個中心點的24-…

Html實現圖片上傳/裁剪/馬賽克/壓縮/旋轉/縮放

cropper下載 https://download.csdn.net/download/dongyan3595/90970115 前端代碼 <!doctype html> <html lang"en"> <head><base href"/aishop/"><meta name"viewport" content"widthdevice-width, initial…

springboot項目中整合高德地圖

一&#xff1a;高德開放平臺的使用 高德開放平臺 | 高德地圖API 注冊高德地圖賬號 認證填寫個人信息&#xff1a; 認證方式選擇“個人認證開發者”即可&#xff0c;然后完善信息 認證成功之后&#xff0c;再次進入控制臺&#xff0c;創建關于地圖的應用 創建Key&#xff08;y…

鴻蒙開發-視頻學習及實用中的一些小結

1.extend 和 styles extend是在styles基礎上進行了升級 使用的時候extend是全局的。 styles不加function 局部 加了就是全局。 2.builder 中要引用comp組件 需要在外層嵌套布局 3.ability之間的跳轉 want需要加&#xff1b; 4. as 類型斷言 &#xff01;跟在xxx! 表示…

網盤直鏈解析網頁版

不支持百度網盤、阿里網盤。 123&#xff0c;藍奏云&#xff0c;可道云什么的都可以 源碼下載地址&#xff1a;https://www.123865.com/s/X91lVv-3l90v

AXI4-Stream Clock Converter IP

一、參考說明 1.沒有專門對AXI4-Stream Clock Converter IP說明的文檔&#xff1b; 2.可以參考PG085文檔&#xff1b; 3.可以參考PG035文檔&#xff1b; 二、IP的作用 1.用于stream數據流再不同的時鐘域之間的可靠性傳輸&#xff1b; 2.支持跨時鐘域的場景&#xff1b; 3.內部…

NineData 社區版 V4.2.0 發布!新增MySQL與PostgreSQL互相遷移,SQL管理Milvus,安裝更高效

NineData 社區版 V4.2.0 正式發布&#xff01;本次更新通過鏡像輕量化部署、新增 3 條遷移鏈路、新增支持 Milvus 向量數據庫等核心升級&#xff0c;輕松實現數據庫遷移容災、實時數據集成分析、AI 向量數據管理等場景需求。社區版支持本地離線部署&#xff0c;嚴格保障數據隱私…

如何安裝使用qmt腳本跟單聚寬策略

登錄知識星球&#xff0c;下載獲取 解壓后&#xff0c;登錄大qmt&#xff0c;將策略導入其中&#xff0c; 然后修改參數&#xff1a; 點擊免密改參 totalcash&#xff1a;該策略使用資金總量 per&#xff1a;每只股票占比資金額 舉例&#xff0c;當前出信號&#xff0c;每只…

什么是MongoDB

目錄 主要特點 MongoDB概念解析 完整術語列表 MongoDB安裝 MongoDB Shell 安裝MongoDB Shell 數據庫管理 查看數據庫列表 創建數據庫 刪除數據庫 默認數據庫 系統內置數據庫 集合管理 查看集合 創建集合 更新集合名 刪除集合 文檔操作 插入文檔 查詢文檔 …

【Docker基礎】Docker核心概念:容器(Container)與鏡像(Image)的區別與聯系

目錄 引言 1 Docker鏡像&#xff08;Image&#xff09; 1.1 鏡像的定義 1.2 鏡像的特點 1.3 鏡像的創建 1.4 鏡像的結構 1.5 鏡像結構描述 2 Docker容器&#xff08;Container&#xff09; 2.1 容器的定義 2.2 容器的特點 2.3 容器的創建與運行 2.4 容器的生命周期…

從零到一:構建企業級 Vue.js 3 組件庫

前言&#xff1a;為何要構建組件庫&#xff1f; 在現代前端工程化體系中&#xff0c;組件庫已不再是大型團隊的專屬。它是一個團隊設計規范、開發模式和技術沉淀的核心載體。構建一個組件庫&#xff0c;能夠帶來諸多優勢&#xff1a; 提升效率&#xff1a;提供可復用的高質量…

【2025 CVPR-Backbone】Building Vision Models upon Heat Conduction

摘要 利用注意力機制的視覺表示模型在追求大感受野時面臨著巨大的計算開銷。在本研究中&#xff0c;我們通過引入基于物理熱傳導原理的熱傳導算子&#xff08;Heat Conduction Operator, HCO&#xff09;來緩解這一挑戰這么高級咩(⊙o⊙)&#xff01;。HCO將圖像塊視為熱源&am…

Rust編寫Shop管理系統

Rust編寫Shop管理系統 Actix Web 是一個功能強大、實用且速度極快的 Rust Web 框架。編寫Shop管理系統 HelloKeny 首先是先編寫最簡單的例子,類似hello World可以檢查環境 Actix Web 是一個功能強大、實用且速度極快的 Rust Web 框架。 命令 cargo new hellokenycd hell…

安寶特案例丨Vuzix AR智能眼鏡集成專業軟件,助力盧森堡醫院藥房轉型,贏得輝瑞創新獎

在Vuzix M400 AR智能眼鏡的助力下&#xff0c;盧森堡羅伯特舒曼醫院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;憑借在無菌制劑生產流程中引入增強現實技術&#xff08;AR&#xff09;創新項目&#xff0c;榮獲了2024年6月7日由盧森堡醫院藥劑師協會&#xff0…

快速冪算法詳解:從暴力到優雅的數學優化

文章目錄 一、樸素冪運算的問題二、快速冪的數學原理三、快速冪的遞歸實現四、快速冪的迭代實現五、模運算下的快速冪六、快速冪的應用場景七、總結 快速冪是一種高效計算冪運算的算法&#xff0c;能夠將時間復雜度從樸素的 O (n) 降低到 O (log n)。本文將深入探討快速冪的原理…

HTML+CSS 動態菜單和登錄框

摘要 實現了一個現代化的登錄/注冊界面&#xff0c;包含導航欄和彈窗表單。 HTML結構采用了響應式設計&#xff0c;包含Logo、導航鏈接和登錄按鈕。 CSS樣式實現了背景圖片、導航欄懸浮效果和表單美化&#xff0c;使用偽元素實現鏈接下劃線動畫。 JavaScript實現了彈窗切換…

抖音AI數字人對口型軟件LatentSync最新版整合包,音頻驅動口型講話

本次和大家分享一個字節跳動開發的強大的音頻驅動口型數字人視頻制作軟件LatentSync&#xff0c;我以前也分享過不少類似軟件了&#xff0c;比如&#xff1a;EchoMimic、VideoReTalking、hallo。字節的推出的這個效果稍微更好一點&#xff0c;我制作了最新版的一鍵啟動整合包。…

深入理解 PyTorch:從基礎到高級應用

在深度學習的浪潮中&#xff0c;PyTorch 憑借其簡潔易用、動態計算圖等特性&#xff0c;迅速成為眾多開發者和研究人員的首選框架。本文將深入探討 PyTorch 的核心概念、基礎操作以及高級應用&#xff0c;帶你全面了解這一強大的深度學習工具。? 一、PyTorch 簡介? PyTorch…