輪廓周長,面積,外界圓,外界矩形近似輪廓和模板匹配和argparse模塊實現代碼參數的動態配置

目錄

一.輪廓操作

1.輪廓特征的引入與篩選

2.輪廓排序和精準定位

3.外接圓與外接矩形的計算與繪制

二.輪廓近似

1.輪廓近似的基本概念

2.輪廓近似的實現方法和核心步驟

3. 近似精度參數的設定邏輯

4.輪廓定位方法

三.模板匹配

1.模板匹配技術原理與實現流程

2.技術要點與注意事項

四.使用argparse模塊實現代碼參數的動態配置,避免手動修改代碼


一.輪廓操作

1.輪廓特征的引入與篩選

  • 基于輪廓的面積和周長特征,可對多個檢測到的輪廓進行簡單篩選
  • 面積(area)和周長(perimeter)是兩個最基礎、易實現的輪廓特征
import cv2
phone=cv2.imread('phone.png')
phone_gray=cv2.imread('phone.png', 0)
ret,phone_binary=cv2.threshold(phone_gray,120,255,cv2.THRESH_BINARY)
contours=cv2.findContours(phone_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[-2]
#指定輪廓面積
area_0=cv2.contourArea(contours[0])
area_1=cv2.contourArea(contours[1])
print(area_0,area_1)
#指定輪廓周長,closed指示曲線是否封閉
length=cv2.arcLength(contours[0],closed=True)
print(length)

2.輪廓排序和精準定位

  • 輪廓定位前需完成預處理,包括灰度化、二值化等步驟
  • 所有輪廓特征提取均基于findContours()獲取的輪廓列表進行
  • 根據特定面積顯示特定輪廓,通過設置面積閾值(如大于一萬),可篩選出滿足條件的目標輪廓

#根據特定面積顯示特定輪廓
a_list=[]
for i in contours:if cv2.contourArea(i)>10000:a_list.append(i)
image_copy=phone.copy()
image_copy=cv2.drawContours(image=image_copy,contours=a_list,contourIdx=-1,color=(0,255,0),thickness=3)
cv2.imshow('Contours_show_10000',image_copy)
cv2.waitKey(0)

  • 可對輪廓列表按面積或周長進行排序(升序或降序),便于快速定位目標
  • 降序排列后索引為0的輪廓即為面積最大的輪廓,可直接提取并繪制
  • 排序后可方便地獲取第二、第三等大輪廓,實現多目標定位
sort_cnt=sorted(contours,key=cv2.contourArea,reverse=True)[0]#選取最大面積的輪廓
image_contours=cv2.drawContours(image_copy,[sort_cnt],contourIdx=-1,color=(0,0,255),thickness=3)
cv2.imshow('image_contours',image_copy)
cv2.waitKey(0)

3.外接圓與外接矩形的計算與繪制

  • 外接圓:通過minEnclosingCircle()計算輪廓的最小外接圓,返回圓心坐標(x,y)和半徑
  • 注意OpenCV坐標系中X軸向右,Y軸向下,與常規坐標系不同
  • 繪制時需將float類型的坐標轉為int類型,避免類型錯誤
  • 外接矩形:通過minAreaRect()計算輪廓的最小外接矩形,返回左上角坐標(x,y)、寬度(w)、高度(h)
  • 繪制時需根據左上角坐標和寬高計算右下角坐標(x+w, y+h)以完成矩形繪制
#外接圓,外界矩形
cnt=contours[7]
(x,y),r=cv2.minEnclosingCircle(cnt)
phone_circle=cv2.circle(phone,(int(x),int(y)),int(r),(0,255,0),2)
cv2.imshow('phone_circle',phone_circle)
cv2.waitKey(0)x,y,w,h=cv2.boundingRect(cnt)#計算該輪廓最小外接矩形
phone=cv2.imread('phone.png')
phone_rect=cv2.rectangle(phone,(x,y),(x+w,y+h),(0,255,0),thickness=3)
cv2.imshow('phone_rect',phone_rect)
cv2.waitKey(0)
cv2.destroyAllWindows()

二.輪廓近似

1.輪廓近似的基本概念

  • 輪廓近似是對原始輪廓進行逼近或擬合,以減少點的數量,從而簡化形狀描述。
  • 原始輪廓由成百上千個點構成(如手機外殼759個點),近似后可簡化為十幾個甚至幾個點(如18個或8個點)。

2.輪廓近似的實現方法和核心步驟

  • 使用OpenCV中的cv2.approxPolyDP()函數實現輪廓近似。
  • 關鍵參數包括:
    • 輸入輪廓(如counters[0]
    • 近似精度(epsilon),表示輪廓近似的程度,通常設置為輪廓周長的百分比(如1%或5%)
    • 是否封閉(closed),默認為True,因為多數輪廓為封閉圖形
epsilon=0.01*cv2.arcLength(contours[0],True)
approx=cv2.approxPolyDP(contours[0],epsilon,True)
print(contours[0].shape)
print(approx.shape)(229, 1, 2)#完整輪廓shape
(8, 1, 2)#近似輪廓shapephone=cv2.imread('phone.png')
phone_new=phone.copy()
image_contours=cv2.drawContours(phone_new,[approx],contourIdx=-1,color=(0,255,0),thickness=3)
cv2.imshow('phone',phone)
cv2.waitKey(0)
cv2.imshow('image_contours',image_contours)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 近似精度參數的設定邏輯

  • 精度參數與近似點數量呈反比:精度越小,近似越精確,點越多;精度越大,近似越粗略,點越少。
  • 實現原理中通過計算“中垂線距離”(H值)與設定精度(epsilon)比較,若H小于epsilon,則直接用兩點連接;否則反復取中垂線,逐步逼近,最終決定采用幾段線段。

4.輪廓定位方法

  • 通過多種方式定位最外層輪廓:
    • 基于輪廓索引遍歷(如取第0個輪廓)
    • 根據輪廓面積或周長進行排序,提取面積最大的輪廓
    • 預估外部輪廓的特征(如周長大、面積大)并設定閾值篩選

三.模板匹配

import cv2
kele=cv2.imread('img.png')
template=cv2.imread('img_template.png')
cv2.imshow('kele',kele)
cv2.imshow('template',template)
cv2.waitKey(0)

1.模板匹配技術原理與實現流程

  • 模板匹配用于在大圖中定位與小圖(模板)完全一致的區域,其核心是遍歷大圖,將模板與每個位置進行比對,計算匹配得分。
  • 匹配過程采用歸一化相關系數(NORMED)方法,得分越大表示匹配越佳,范圍在 0 到 1 之間。
  • 遍歷整張大圖后,提取得分最大值的位置(通過minMaxLoc()?獲取坐標),該坐標即為模板匹配的最優位置。
  • 根據最高得分坐標的左上角坐標(top-left)與模板圖片的寬高,計算右下角坐標(x+w, y+h)
  • 通過?cv2.rectangle()?在原圖上繪制矩形框,標注匹配區域。
h,w=template.shape[:2]
res=cv2.matchTemplate(kele,template,cv2.TM_CCORR_NORMED)
min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)
top_left=max_loc#所要繪制矩形左上角的坐標(x,y)
bottom_right=(top_left[0]+w,top_left[1]+h)
kele_template=cv2.rectangle(kele,top_left,bottom_right,(0,255,0),2)
cv2.imshow('kele_template',kele_template)
cv2.waitKey(0)

2.技術要點與注意事項

  • 模板與目標區域的尺寸必須完全一致,否則無法準確匹配。
  • 匹配結果中需分析得分矩陣,識別最大值位置,避免誤選低分區域。
  • 該技術為后續銀行卡號識別等場景提供了基礎方法論。

四.使用argparse模塊實現代碼參數的動態配置,避免手動修改代碼

  • 創建參數時使用add_argument指定參數名、類型(string/int/float)、默認值和幫助說明
  • 參數可通過右鍵“運行配置”或終端命令行直接設置,支持別名(alias)優化可讀性
  • 支持通過python main.py param1 value1 param2 value2方式運行或通過python main.py -h查看所有參數列表
import argparse
parser=argparse.ArgumentParser()
parser.add_argument('--name',type=str,default='john',help='姓名')
parser.add_argument('--age',type=int,default=18,help='年齡')
parser.add_argument('--weight',type=float,default=120.0,help='體重')
opt=parser.parse_args()
print('我叫{}我今年{}歲體重{}kg'.format(opt.name,opt.age,opt.weight))

或者通過修改運行配置

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

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

相關文章

【第三方網站測評:會話管理漏洞的測試與加固】

會話管理是Web應用安全的用于在無狀態的HTTP協議上維持用戶狀態。漏洞主要源于會話令牌(Session Token)的生成、傳輸、驗證和銷毀過程中的缺陷。攻擊者利用這些缺陷可劫持用戶會話,未經授權訪問敏感數據或執行特權操作,屬于OWASP TOP 10中身份驗證失效的高頻風險。 會話管…

理想汽車智駕方案介紹專題 3 MoE+Sparse Attention 高效結構解析

一、前言 【理想汽車智駕方案介紹專題 -1】端到端VLM 方案介紹 【理想汽車智駕方案介紹專題 -2】MindVLA 方案詳解 在上述兩篇系列帖子中,筆者已對理想汽車 VLM 和 VLA 方案的框架進行了全面介紹,但對于其中的前沿技術僅做了初步探討,未進…

如何將yolo訓練圖像數據庫的某個分類的圖像取出來

COCO 數據集 - Ultralytics YOLO 文檔 比如我只想從數據集中取手機的圖像,來用于我的訓練,懶得自己一張一張標注,方法如下 # -*- coding: utf-8 -*- import json import os import shutil from pathlib import Path from tqdm import tqdm i…

【WPF】WPF 自定義控件實戰:從零打造一個可復用的 StatusIconTextButton (含避坑指南)

🔧 WPF 自定義控件實戰:從零打造一個可復用的 StatusIconTextButton(含避坑指南)發布于:2025年8月29日 標簽:WPF、C#、自定義控件、MVVM、Generic.xaml、屬性綁定、TemplateBinding📌 引言 在 W…

中國國際商會副秘書長徐梁一行到訪國聯股份

2025年08月27日,中國國際商會副秘書長徐梁等一行到訪國聯股份,國聯股份創始人、CEO/總裁錢曉鈞,國聯股份副總裁、衛多多/紙多多CEO黃莎莎等熱情招待來訪一行,并展開深入交流。來訪一行首先參觀了國聯股份數字經濟展廳,…

換公司如何快速切入軟件項目工程

一、前言 作為程序員,根據自身職業發展,會通過跳槽謀求更進一步的發展,這時進入新公司,接觸全新的項目工程和業務,如何快速的切入,形成認識呢?就算不跳槽,公司業務調整,也…

Linux系統——EXT2 文件系統

磁盤文件 文件屬性 文件內容文件內容 —— 數據塊,文件屬性 —— inodeLinux 文件在磁盤中的存儲,是將 屬性 與 內容 分開存儲的內存:掉電易失,磁盤:永久性存儲介質圖片來自百度磁盤訪問的基本單元:扇區 …

Qt中的鎖(1)

Qt中的鎖(1) 加鎖,把多個要訪問的公共資源通過鎖保護起來,把并行執行變成串行執行, 多個線程執行加鎖的對象得是同一個對象,不同對象不會互斥 代碼://添加一個static成員static int num;//創建鎖…

數據結構 02(線性:順序表)

目錄 線性表 順序表 概念與結構 動態順序表的實現 頭文件的創建 順序表初始化 順序表的擴容 尾插功能 頭插功能 尾刪功能 頭刪功能 查找功能 任意位置前插入 任意位置前刪除 銷毀 動態順序表整體呈現 SeqList.h SeqList.c 線性表 線性表是n個具有相同特性的數…

自助餐廳:自主取餐的平衡術

自助餐廳,本質是通過 “固定客單價 自主取餐” 的模式,把 “吃什么、吃多少” 的選擇權還給用戶,同時用運營設計平衡 “用戶體驗” 與 “餐廳成本”—— 它不是 “讓用戶吃垮餐廳” 的游戲,而是餐飲行業里 “效率與體驗結合” 的…

TypeScript: Reflect.ownKeys 操作(針對 Symbol)

Reflect.ownKeys 是 JavaScript ES6 引入的 Reflect API 中的一個方法,用于獲取目標對象的所有自身屬性鍵(包括字符串鍵和 Symbol 鍵)。1.基本概念:Reflect.ownKeys(target):接受一個對象 target 作為參數,…

一般納稅人

目錄 一文詳解:什么是一般納稅人? 一、核心定義:什么是一般納稅人? 二、成為一般納稅人的兩種途徑 三、一般納稅人的關鍵特點與運作機制 四、一般納稅人的優點與缺點 五、與小規模納稅人的核心區別 六、企業應如何選擇&…

@HAProxy 介紹部署使用

文章目錄**1. HAProxy 簡介****1.1 什么是 HAProxy?****1.2 核心特性****1.3 關鍵術語****2. 安裝 HAProxy****2.1 在 Ubuntu/Debian 上安裝****2.2 在 CentOS/RHEL/Rocky Linux/AlmaLinux 上安裝****3. 配置與使用****3.1 核心配置文件結構****3.2 基礎配置示例&am…

Two-Twer模型做歌曲智能推薦與規則算法對比的優缺點分析

基于規則與機器學習驅動的音樂推薦:核心差異分析1.推薦精度2. 個性化能力3. 模型適應性(潛在特征關聯發現)4. 可擴展性與復雜性成本5. 冷啟動/數據稀疏階段表現6. 聽感匹配與主觀反饋1.推薦精度 規則推薦: 依賴預設的 if-then 邏…

【完整源碼+數據集+部署教程】停車位狀態檢測系統源碼和數據集:改進yolo11-DCNV2-Dynamic

背景意義 隨著城市化進程的加快,城市交通擁堵問題日益嚴重,停車難成為了許多城市居民面臨的普遍問題。有效的停車管理不僅可以提高城市交通的流動性,還能減少因尋找停車位而造成的時間浪費和環境污染。因此,開發一個高效的停車位狀…

《Password Guessing Using Random Forest》論文解讀

論文填補了傳統統計方法(如 PCFG、Markov)與深度學習方法(如 LSTM、GAN)之間的研究空白,提出基于隨機森林的口令猜測框架 RFGuess,覆蓋三種核心猜測場景,為口令安全研究提供了全新技術路線。一、…

項目一系列-第9章 集成AI千帆大模型

第9章 集成AI千帆大模型 學習目標 能夠說清楚健康評估模塊在項目中的作用能夠掌握千帆大模型的開通和對接能夠掌握健康評估模塊中的prompt提示詞編寫能夠自主完成健康評估模塊的接口開發 分析設計 需求說明 健康評估是指老人辦理入住前需上傳體檢報告,由AI自動…

vben admin5組件文檔(豆包版)---VbenTree

VbenTree 用法說明 VbenTree 是 Vben5 中基于 radix-vue 實現的樹形組件,支持單選、多選、展開/折疊、權限控制等功能。以下是其核心用法說明: 1. 基礎引入 import { VbenTree } from vben-core/shadcn-ui;2. 核心屬性(Props)屬性…

postman常用快捷鍵

作為一名IT程序猿,不懂一些工具的快捷方式,應該會被鄙視的吧。收集了一些Postman的快捷方式,大家一起動手操作~ 1小時postman接口測試從入門到精通教程簡單操作 操作mac系統windows系統 打開新標簽 ?TCtrl T關閉標簽?WCtrl W強制關閉標簽…

【物聯網】什么是 DHT11(數字溫濕度傳感器)?

正面照片(藍色傳感器朝上,針腳朝下) 絲印標注非常清晰: 左邊 → S 👉 信號 (DATA) 中間 → 👉 VCC (電源,3.3V 或 5V) 右邊 → - 👉 GND (地) ? 正確接法(Arduino Nano…