OpenCV 圖像處理實戰與命令行參數配置:從輪廓檢測到模板匹配

在計算機視覺領域,OpenCV 是一款功能強大且應用廣泛的開源庫,它提供了豐富的 API,支持圖像讀取、預處理、特征檢測等多種操作。本文將結合實際代碼案例,詳細講解如何使用 OpenCV 實現輪廓檢測、輪廓近似、模板匹配等常用功能,同時介紹如何通過argparse模塊配置命令行參數,讓程序更具靈活性和可擴展性。

一、OpenCV 圖像處理核心功能實戰

(一)圖像輪廓檢測與篩選

輪廓是圖像中物體邊界的重要表示,通過檢測輪廓,我們可以獲取物體的形狀、大小等關鍵信息。以下代碼實現了從圖像讀取、預處理到輪廓檢測、篩選與繪制的完整流程。

import cv2# 1. 讀取圖像并進行預處理
phone = cv2.imread('lunkuo.png')  # 替換為你的圖片路徑
# 轉為灰度圖,減少計算量并為后續二值化做準備
gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)
# 二值化處理:將灰度圖轉為黑白二值圖,突出物體輪廓
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 2. 檢測輪廓(兼容OpenCV 3.x和4.x版本)
img, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 3. 計算輪廓的面積與周長
# 計算前兩個輪廓的面積
area_0 = cv2.contourArea(contours[0])
print(f"第一個輪廓的面積:{area_0}")
area_1 = cv2.contourArea(contours[1])
print(f"第二個輪廓的面積:{area_1}")
# 計算第一個輪廓的周長(closed=True表示輪廓是閉合的)
length = cv2.arcLength(contours[0], closed=True)
print(f"第一個輪廓的周長:{length}")# 4. 篩選面積大于10000的輪廓(去除小噪聲輪廓)
filtered_contours = []
for contour in contours:if cv2.contourArea(contour) > 10000:filtered_contours.append(contour)
# 繪制篩選后的輪廓(綠色,線寬3)
image_copy = phone.copy()
cv2.drawContours(image=image_copy, contours=filtered_contours,contourIdx=-1, color=(0, 255, 0), thickness=3)
cv2.imshow('Contours_show_10000', image_copy)
cv2.waitKey(0)  # 等待按鍵,按下任意鍵關閉窗口# 5. 找到面積最大的輪廓并繪制(紅色,線寬3)
# 按面積降序排序輪廓
sorted_contours = sorted(contours, key=cv2.contourArea, reverse=True)
largest_contour = sorted_contours[0]
# 繪制最大輪廓
image_copy = phone.copy()
cv2.drawContours(image=image_copy, contours=[largest_contour],contourIdx=-1, color=(0, 0, 255), thickness=3)
cv2.imshow('largest_contour', image_copy)
cv2.waitKey(0)# 6. 為指定輪廓繪制外接圓和外接矩形
cnt = contours[2]  # 選擇第三個輪廓(可根據實際需求調整索引)
# 繪制外接圓(綠色,線寬2)
(x, y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))  # 圓心坐標(需轉為整數,圖像像素坐標為整數)
phone_circle = cv2.circle(phone, center, int(radius), (0, 255, 0), 2)
cv2.imshow('phone_circle', phone_circle)
cv2.waitKey(0)
# 繪制外接矩形(綠色,線寬2)
x, y, w, h = cv2.boundingRect(cnt)  # x,y為矩形左上角坐標,w為寬,h為高
phone_rectangle = cv2.rectangle(phone, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('phone_rectangle', phone_rectangle)
cv2.waitKey(0)cv2.destroyAllWindows()  # 關閉所有OpenCV窗口

關鍵知識點解析

  • 圖像預處理cvtColor將 BGR 格式(OpenCV 默認讀取格式)轉為灰度圖,threshold通過設定閾值(此處為 127)將灰度圖轉為二值圖,讓輪廓更清晰。
  • 輪廓檢測findContours函數中,RETR_TREE表示獲取輪廓的層級關系,CHAIN_APPROX_SIMPLE會簡化輪廓,去除冗余點,減少內存占用。
  • 輪廓篩選與排序:通過contourArea計算輪廓面積,結合條件判斷篩選出目標輪廓;sorted函數配合cv2.contourArea可按面積對輪廓排序,輕松找到最大輪廓。

(二)輪廓近似:簡化復雜輪廓

當輪廓邊緣過于復雜(如包含大量細小鋸齒)時,我們可以通過輪廓近似算法,用更少的點表示輪廓,同時保留其整體形狀。以下代碼演示了輪廓近似的實現過程:

import cv2# 1. 讀取圖像并預處理(步驟與上一部分類似)
phone = cv2.imread('lunkuo.png')
gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 2. 檢測輪廓(兼容不同OpenCV版本,取返回值的后兩個元素)
contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2]# 3. 輪廓近似
# epsilon為近似精度,是輪廓周長的百分比(此處為1%),值越小,近似輪廓越接近原輪廓
epsilon = 0.01 * cv2.arcLength(contours[0], True)
# approxPolyDP函數實現輪廓近似,True表示輪廓閉合
approx = cv2.approxPolyDP(contours[0], epsilon, True)# 4. 對比原輪廓與近似輪廓的形狀(輸出點的數量)
print(f"原輪廓的點數量:{contours[0].shape}")  # 格式為(N, 1, 2),N為點的數量
print(f"近似輪廓的點數量:{approx.shape}")# 5. 繪制近似輪廓并顯示
phone_new = phone.copy()
image_contours = cv2.drawContours(phone_new, [approx], contourIdx=-1, color=(0, 255, 0), thickness=3)
cv2.imshow('原始圖像', phone)
cv2.waitKey(0)
cv2.imshow('近似輪廓', image_contours)
cv2.waitKey(0)
cv2.destroyAllWindows()

核心原理:輪廓近似基于Douglas-Peucker 算法,通過設定epsilon值控制近似程度。epsilon越小,近似輪廓與原輪廓的差異越小,但點的數量越多;epsilon越大,輪廓越簡化,但可能丟失細節。實際應用中需根據需求調整該參數。

(三)模板匹配:在圖像中查找目標物體

模板匹配是通過滑動模板圖像在待檢測圖像上移動,計算模板與待檢測圖像各區域的相似度,從而找到目標物體位置的技術。以下代碼實現了在 “可樂” 圖像中查找 “瓶蓋” 模板的功能:

import cv2# 1. 讀取待檢測圖像(kele.png)和模板圖像(keke.png)
kele = cv2.imread('kele.png')
keke = cv2.imread('keke.png')# 2. 顯示原始圖像,確認圖像讀取成功
cv2.imshow('可樂圖像', kele)
cv2.imshow('瓶蓋模板', keke)
cv2.waitKey(0)# 3. 獲取模板圖像的高和寬(用于后續繪制矩形)
h, w = keke.shape[:2]  # shape返回(高, 寬, 通道數),取前兩個元素# 4. 執行模板匹配
# 匹配方法:cv2.TM_CCORR_NORMED(歸一化相關匹配),返回相似度矩陣
res = cv2.matchTemplate(kele, keke, cv2.TM_CCORR_NORMED)# 5. 找到相似度最高的位置(歸一化匹配中,最大值對應最相似區域)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = max_loc  # 匹配區域的左上角坐標
bottom_right = (top_left[0] + w, top_left[1] + h)  # 匹配區域的右下角坐標# 6. 在待檢測圖像上繪制矩形框,標記目標位置(綠色,線寬2)
kele_keke = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2)# 7. 顯示匹配結果
cv2.imshow('模板匹配結果', kele_keke)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意事項

  • 模板匹配對尺度和旋轉敏感,如果目標物體在待檢測圖像中發生縮放或旋轉,匹配效果會顯著下降,此時需結合尺度不變特征變換(SIFT)、旋轉不變特征變換(SURF)等算法。
  • 匹配方法的選擇:除TM_CCORR_NORMED外,OpenCV 還提供TM_SQDIFF(平方差匹配,最小值為最佳匹配)、TM_CCOEFF(相關系數匹配)等方法,需根據實際場景選擇。

二、用 argparse 配置命令行參數,提升程序靈活性

在實際項目中,我們常需要調整程序參數(如閾值、端口號等),如果每次修改都直接改動代碼,效率較低。argparse是 Python 標準庫中的模塊,可實現命令行參數的解析,讓參數配置更便捷。以下代碼演示了其基本用法:

import argparse# 1. 創建參數解析器對象
parser = argparse.ArgumentParser(description='命令行參數配置示例')  # description為程序描述# 2. 添加命令行參數
# --SERIAL_PORT1:第一個報警器的串口號,字符串類型,默認值為COM5,help為參數說明
parser.add_argument('--SERIAL_PORT1', type=str, default='COM5', help='第一個報警器的串口號')
# --area_thred:物體面積閾值,整數類型,默認值1600
parser.add_argument('--area_thred', type=int, default=1600, help='物體面積的閾值')
# --confid_level:識別置信度,浮點類型,默認值0.8
parser.add_argument('--confid_level', type=float, default=0.8, help='識別的置信度')
# --aaa:自定義整數參數,默認值100(無短選項)
parser.add_argument('--aaa', type=int, default=100)
# -b/--bbb:自定義整數參數,支持短選項(-b)和長選項(--bbb),默認值10
parser.add_argument('-b', '--bbb', type=int, default=10)# 3. 解析命令行參數
opt = parser.parse_args()# 4. 使用解析后的參數
a = opt.aaa
b = opt.bbb
print(f"參數aaa與bbb的和為:{a + b}")

使用方法

  1. 將代碼保存為argparse_demo.py
  2. 在命令行中運行,可直接使用默認參數:

    bash

    python argparse_demo.py
    

    輸出:參數aaa與bbb的和為:110
  3. 也可在命令行中指定參數值,覆蓋默認值:

    bash

    python argparse_demo.py --aaa 200 -b 50 --SERIAL_PORT1 COM3 --area_thred 2000
    

    輸出:參數aaa與bbb的和為:250

優勢:通過argparse,我們無需修改代碼,即可在命令行中靈活調整參數,尤其適合批量運行程序或在服務器環境中使用。

三、總結與拓展

本文通過實際代碼案例,講解了 OpenCV 中輪廓檢測、輪廓近似、模板匹配等核心功能的實現,同時介紹了argparse模塊的使用,幫助提升程序的靈活性。這些技術在目標檢測、圖像分割、物體識別等場景中應用廣泛,例如:

  • 工業質檢:通過輪廓檢測判斷產品是否存在缺陷。
  • 智能監控:通過模板匹配查找特定目標(如可疑物品)。
  • 機器人視覺:通過輪廓近似簡化物體形狀,便于機器人抓取。

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

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

相關文章

深度學習---pytorch卷積神經網絡保存和使用最優模型

在深度學習模型訓練過程中,如何提升模型性能、精準保存最優模型并實現高效推理,是每個開發者必須攻克的關鍵環節。本文結合實際項目經驗與完整代碼示例,詳細拆解模型訓練優化、最優模型保存與加載、圖像預測全流程,幫助大家避開常…

FPGA實現Aurora 64B66B圖像視頻點對點傳輸,基于GTY高速收發器,提供2套工程源碼和技術支持

目錄 1、前言Aurora 64B66B是啥?官方有Example,為何要用你這個?工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目我這里已有的 GT 高速接口解決方案本方案在Aurora 8B10B上的應用 3、工程詳細設…

LeetCode 524.通過刪除字母匹配到字典里最長單詞

給你一個字符串 s 和一個字符串數組 dictionary ,找出并返回 dictionary 中最長的字符串,該字符串可以通過刪除 s 中的某些字符得到。 如果答案不止一個,返回長度最長且字母序最小的字符串。如果答案不存在,則返回空字符串。 示例…

kali_linux

【2024版】最新kali linux入門及常用簡單工具介紹(非常詳細)從零基礎入門到精通,看完這一篇就夠了-CSDN博客

MyBatis 常見錯誤與解決方案:從坑中爬出的實戰指南

🔍 MyBatis 常見錯誤與解決方案:從坑中爬出的實戰指南 文章目錄🔍 MyBatis 常見錯誤與解決方案:從坑中爬出的實戰指南🐛 一、N1 查詢問題與性能優化💡 什么是 N1 查詢問題??? 錯誤示例? 解決…

藍牙modem端frequency offset compensation算法描述

藍牙Modem中一個非常關鍵的算法:頻偏估計與補償(Frequency Offset Estimation and Compensation)。這個算法是接收機(解調端)能正確工作的基石。 我將為您詳細解釋這個算法的原理、必要性以及其工作流程。 一、核心問題:為什么需要頻偏補償? 頻偏的來源: 如第一張圖所…

基于STM32的居家養老健康安全檢測系統

若該文為原創文章,轉載請注明原文出處。一、 項目背景與立項意義社會老齡化趨勢加劇:全球范圍內,人口結構正經歷著前所未有的老齡化轉變。中國也不例外,正快速步入深度老齡化社會。隨之而來的是龐大的獨居、空巢老年人群體的健康監…

簡易TCP網絡程序

目錄 1. TCP 和 UDP 的基本區別 2. TCP 中的 listen、accept 和 connect 3. UDP 中的區別:沒有 listen、accept 和 connect 4. 總結對比: 2.字符串回響 2.1.核心功能 2.2 代碼展示 1. server.hpp 服務器頭文件 2. server.cpp 服務器源文件 3. …

廣電手機卡到底好不好?

中國廣電于2020年與中國移動簽署了戰略合作協議,雙方在5G基站建設方面實現了共建共享。直到2022年下半年,中國廣電才正式進入號卡服務領域,成為新晉運營商。雖然在三年的時間內其發展速度較快,但對于消費者而言,廣電的…

Git中批量恢復文件到之前提交狀態

<摘要> Git中批量恢復文件到之前提交狀態的核心命令是git checkout、git reset和git restore。根據文件是否已暫存&#xff08;git add&#xff09;&#xff0c;需采用不同方案&#xff1a;未暫存變更用git checkout -- <file>或git restore <file>丟棄修改&…

UniApp 基礎開發第一步:HBuilderX 安裝與環境配置

UniApp 是一個基于 Vue.js 的跨平臺開發框架&#xff0c;支持快速構建小程序、H5、App 等應用。作為開發的第一步&#xff0c;正確安裝和配置 HBuilderX&#xff08;官方推薦的 IDE&#xff09;是至關重要的。下面我將以清晰步驟引導您完成整個過程&#xff0c;確保環境可用。整…

華為云Stack Deploy安裝(VMware workstation物理部署)

1.1 華為云Stack Deploy安裝(VMware workstation物理部署) 步驟 1 安裝軟件及環境準備 HUAWEI_CLOUD_Stack_Deploy_8.1.1-X86_64.iso HCSD安裝鏡像 VMware workstation軟件 VirtualBox安裝包 步驟2 修改VMware workstation網絡模式 打開VMware workstation軟件,點“編輯”…

安全等保復習筆記

信息安全概述1.2 信息安全的脆弱性及常見安全攻擊 ? 網絡環境的開放性物理層--物理攻擊 ? 物理設備破壞 ? 指攻擊者直接破壞網絡的各種物理設施&#xff0c;比如服務器設施&#xff0c;或者網絡的傳輸通信設施等 ? 設備破壞攻擊的目的主要是為了中斷網絡服務 ? 物理設備竊…

【Audio】切換至靜音或振動模式時媒體音自動置 0

一、問題描述 基于 Android 14平臺&#xff0c;AudioService 中當用戶切換到靜音模式&#xff08;RINGER_MODE_SILENT&#xff09;或振動模式&#xff08;RINGER_MODE_VIBRATE&#xff09;時會自動將響鈴和通知音量置0&#xff0c;當切換成響鈴模式&#xff08;RINGER_MODE_NO…

VPS云服務器安全加固指南:從入門到精通的全面防護策略

在數字化時代&#xff0c; VPS云服務器已成為企業及個人用戶的重要基礎設施。隨著網絡攻擊手段的不斷升級&#xff0c;如何有效進行VPS安全加固成為每個管理員必須掌握的技能。本文將系統性地介紹從基礎配置到高級防護的完整安全方案&#xff0c;幫助您構建銅墻鐵壁般的云服務器…

Mysql雜志(八)

游標游標是MySQL中一種重要的數據庫操作機制&#xff0c;它解決了SQL集合操作與逐行處理之間的矛盾。這個相信大家基本上都怎么使用過&#xff0c;這個都是建立在使用存儲過程的基礎上的。我們都知道SQL都是批量處理的也就是面向集合操作&#xff08;一次操作多行&#xff09;&…

Dify 從入門到精通(第 71/100 篇):Dify 的實時流式處理(高級篇)

Dify 從入門到精通&#xff08;第 71/100 篇&#xff09;&#xff1a;Dify 的實時流式處理 Dify 入門到精通系列文章目錄 第一篇《Dify 究竟是什么&#xff1f;真能開啟低代碼 AI 應用開發的未來&#xff1f;》介紹了 Dify 的定位與優勢第二篇《Dify 的核心組件&#xff1a;從…

日志分析與安全數據上傳腳本

最近在學習計算機網絡&#xff0c;想著跟python結合做一些事情。這段代碼是一個自動化腳本&#xff0c;它主要有三個功能&#xff1a;分析日志&#xff1a; 它從你指定的日志文件中讀取內容&#xff0c;并篩選出所有包含特定關鍵字的行。網絡交互&#xff1a; 它將篩選出的數據…

【論文閱讀】Sparse4D v3:Advancing End-to-End 3D Detection and Tracking

標題&#xff1a;Sparse4D v3&#xff1a;Advancing End-to-End 3D Detection and Tracking 作者&#xff1a;Xuewu Lin, Zixiang Pei, Tianwei Lin, Lichao Huang, Zhizhong Su motivation 作者覺得做自動駕駛&#xff0c;還需要跟蹤。于是更深入的把3D-檢測&跟蹤用sparse…

基于 DNA 的原核生物與微小真核生物分類學:分子革命下的范式重構?

李升偉 李昱均 茅 矛&#xff08;特趣生物科技公司&#xff0c;email: 1298261062qq.com&#xff09;傳統微生物分類學長期依賴形態特征和生理生化特性&#xff0c;這在原核生物和微小真核生物研究中面臨巨大挑戰。原核生物形態簡單且表型可塑性強&#xff0c;微小真核生物…