OpenCV —— contours_matrix_()_[]

在這里插入圖片描述
在這里插入圖片描述

😶?🌫?😶?🌫?😶?🌫?😶?🌫?Take your time ! 😶?🌫?😶?🌫?😶?🌫?😶?🌫?
💥個人主頁:🔥🔥🔥大魔王🔥🔥🔥
💥所屬專欄:🔥魔王的修煉之路–Computer vision🔥
如果你覺得這篇文章對你有幫助,請在文章結尾處留下你的點贊👍和關注💖,支持一下博主。同時記得收藏?這篇文章,方便以后重新閱讀。

文章目錄

  • 檢測輪廓
  • numpy 創建矩陣與數組
  • 三種圖像的區別及轉換
  • () 與 [] 應用

檢測輪廓

import cv2
import numpy as npcv2.namedWindow("win", cv2.WINDOW_NORMAL)# 自己創建圖像
# # (y,x)
# img = np.zeros((480, 640, 3), np.uint8)# # 繪制一個長方形(x,y)
# cv2.rectangle(img, (100, 50), (500, 400), (255, 255, 255), 2) # 這需要是白色,因為在灰度圖轉為二值圖時,閾值的影響。
# # 具體原因:彩色圖轉為灰度圖后,灰度圖對應的數字低于閾值,在轉的時候就跟著黑色背景也變為了黑色,所以就檢測不到輪廓了。
# # 二值化的閾值要小于灰度圖里你想保留的區域的灰度值,否則就變成背景,輪廓自然找不到。# 讀取圖像
img = cv2.imread("../images/3.jpg")print(img.shape) # 形狀# 彩色圖轉為灰度圖(單通道)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化(只能從灰度圖轉過來)
# 參數:灰度圖(單通道);閾值;最大值(即高于閾值設置為多少);閾值處理類型
# 返回值:實際使用的閾值(一般就是你輸入的閾值);二值圖
# 單詞意思:threshold,閾值。
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY) #  + cv2.THRESH_OTSU# 查找輪廓(一般都轉換成灰度圖查找):普通繪制輪廓、多邊形逼近、凸包,都必須在查找輪廓后進行!
# 參數:二值圖;怎么查找輪廓(即下標順序以及是否查找內部輪廓);表示怎么記錄輪廓,當前的是只記錄關鍵點
# 返回值:輪廓(點的集合);層級關系
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 打印輪廓(點集)
# print(contours)# 繪制輪廓
# 參數:原圖(因為輪廓已經有了,不用二值圖了,也不能繪制在二值圖);輪廓;繪制哪個輪廓(-1 全部繪制);顏色;粗細(-1 填充外部空間)
cv2.drawContours(img, contours, -1, (0, 0, 255), 3) # 第二個參數需要是多個輪廓的列表,正好 findContours() 返回的就是# # 繪制最大輪廓,因為很亂
# # 找到最大輪廓
# max_contour = max(contours, key=cv2.contourArea)
# # 繪制最大輪廓
# cv2.drawContours(img, [max_contour], -1, (0, 0, 255), 2)# 計算面積
area = cv2.contourArea(contours[0])
print(type(area))
print(f"area = {area}")# 計算周長
# 參數:計算哪個輪廓周長;是否計算首尾相連的長度
len = cv2.arcLength(contours[0], True)
print(len)# 多邊形逼近:一次只能處理一個輪廓
# 參數:通常取1%~5% 周長
e = 20 # 精度 
approx = cv2.approxPolyDP(contours[0], e, True) # 返回的是一個輪廓逼近后的數據
# cv2.drawContours(img, [approx], -1, (0, 0, 255)) # 第二個參數需要是多個輪廓的列表# 凸包:一次只能處理一個輪廓
hull = cv2.convexHull(contours[0])# 返回的是一個輪廓逼近后的數據
cv2.drawContours(img, [approx], -1, (0, 0, 255)) # 第二個參數需要是多個輪廓的列表cv2.imshow("win", img)key = cv2.waitKey(0)
if key & 0xff == ord('q'):cv2.destroyAllWindows()

numpy 創建矩陣與數組

將彩色圖轉換為灰度圖,是為了簡化通道;二值化,是為了突出目標和背景;這樣才能穩定高效地提取輪廓。

目標用途推薦函數(不絕對,看你怎么給結構)示例
創建圖像矩陣用作圖像(黑、白、灰背景)np.zeros / ones / full(np.uint8)np.zeros((H, W, 3), np.uint8)
創建點集數組用于輪廓、多邊形坐標np.array([...], np.int32)np.array([(x1,y1), (x2,y2), ...])
返回的數據類型都是np.ndarray(NumPy數組)可直接傳給 OpenCV 繪圖/處理函數

三種圖像的區別及轉換

步驟數據形式通道數優點用途
彩色圖像[B, G, R]3色彩豐富原始圖、顯示用
灰度圖像[0~255]1亮度信息,降維邊緣檢測、二值化前處理
二值圖像0或2551背景/前景分明,適合分析形狀查找輪廓、區域分析
輪廓數據一組點坐標N/A表示物體邊界(如矩形、曲線)識別目標、標注框、形狀分析等
操作OpenCV 函數
彩色 → 灰度cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
灰度 → 二值cv2.threshold()
邊緣檢測(可選)cv2.Canny()
輪廓查找cv2.findContours()
繪制輪廓cv2.drawContours()

() 與 [] 應用

[]列表:可變的、常用的點集、數組等:

[1, 2, 3]                          # Python 列表
[(100, 100), (200, 200)]          # 點集(列表嵌套元組)
np.array([[1,2], [3,4]])          # 用列表構造數組(array 一般用于點集,數組即圖片用 zeros\ones\full等)

()元組:不可變,很多坐標點(以及 shape)就是元組

(100, 200)                        # 一個點的坐標(x, y)
(200, 200, 3)                     # 圖像的 shape

?? 注意:在 Python 中 (x, y)[x, y] 都能表示坐標,但 元組更常見更推薦


數組索引/切片 → []

數組訪問用 [],絕不能用 ()

img[0, 0]                 # 訪問圖像的第一個像素(BGR 值)
gray[100:200, 50:100]     # 切片區域
pts[0]                    # 第一個點

典型例子對比

場景示例代碼說明
? 調用函數cv2.threshold(..., ...)函數調用,傳入參數 → 用小括號 ()
? 創建數組np.zeros((200, 200, 3), np.uint8)函數里再傳個元組 (H, W, C)()
? 創建點集pts = np.array([(x1, y1), (x2, y2)], np.int32)列表 [] 里嵌套元組 ()
? 數組索引img[100, 50]圖像訪問,用方括號 []

總結口訣:

🔹 函數要調用,用 ()
🔹 列表元素,用 []
🔹 點的坐標,用 ()(元組更常見)
🔹 數組取值,也用 []

  • 博主長期更新,博主的目標是不斷提升閱讀體驗和內容質量,如果你喜歡博主的文章,請點個贊或者關注博主支持一波,我會更加努力的為你呈現精彩的內容。

🌈專欄推薦
😈魔王的修煉之路–C語言
😈魔王的修煉之路–數據結構
😈魔王的修煉之路–C++
😈魔王的修煉之路–QT
😈魔王的修煉之路–算法
😈魔王的修煉之路–力扣
😈魔王的修煉之路–牛客
😈魔王的修煉之路–劍指offer
😈魔王的修煉之路–Linux
😈魔王的修煉之路–Computer vision
更新不易,希望得到友友的三連支持一波。收藏這篇文章,意味著你將永久擁有它,無論何時何地,都可以立即找到重新閱讀;關注博主,意味著無論何時何地,博主將永久和你一起學習進步,為你帶來有價值的內容。

請添加圖片描述

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

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

相關文章

android 小bug :文件沖突的問題

文章目錄前言1、問題:兩個文件沖突了2、原因:3、結果:后語前言 一個身份證模塊識別的小bug,記錄一下,這應該是第三次出現,每次出現都不太記得,還是得記錄,不然都是重復檢索的過程。…

Java學習第七十三部分——Redis

目錄 一、前言提要 二、核心特性 三、數據結構 四、應用場景 五、架構模式 六、性能優勢 七、客戶端庫 八、注意事項 九、選擇建議 十、使用示例——基于Jedis 和 Lettuce 十一、生態集成——基于Spring Boot 十二、企業級能力 十三、持久化機制 十四、高…

(LeetCode 每日一題) 3487. 刪除后的最大子數組元素和 (哈希表)

題目:3487. 刪除后的最大子數組元素和 思路:哈希表,時間復雜度0(n)。 維護數組nums的最大值mx,同時用哈希表mp維護數組中非負數出現的情況,記錄非負數的和sum。如果哈希表mp的大小為0,那么數組nums都是負數…

C 語言輸入輸出 (I/O)

C 語言輸出在C語言編程中&#xff0c;printf()是主要的輸出函數之一。該函數將格式化的輸出發送到屏幕。例如&#xff0c;示例1&#xff1a;C 語言輸出#include <stdio.h>int main (int argc, char* argv) {printf("Hello world\n");return 0; }輸出結果C Prog…

分布式系統中的緩存設計與應用

引言 緩存是分布式系統中的重要組件&#xff0c;主要解決高并發&#xff0c;大數據場景下&#xff0c;熱點數據訪問的性能問題。提供高性能的數據快速訪問。 本文是緩存在分布式應用第一篇文章&#xff0c;介紹緩存的原理&#xff0c;緩存的分類&#xff0c;緩存的設計&#xf…

智能機器人的技術革命:從感知到決策的全棧架構解析

——基于多模態大模型的下一代機器人系統設計引言&#xff1a;機器人技術的范式遷移當波士頓動力的Atlas完成后空翻時&#xff0c;全球見證了機器人運動控制的巔峰&#xff1b;但當Figure 01通過大模型理解人類模糊指令并自主執行任務時&#xff0c;我們正見證機器人認知智能的…

day20 雙向鏈表

雙向鏈表的函數功能注意事項 1.雙向鏈表還需要關注到前指針的指向2.函數都需要判斷邏輯3.函數的增刪都要關注到len的變化4.函數的改查功能都需要遍歷結束的標志NULL5.注意p->next->prio時&#xff0c;p->next是否指向NULL創建雙向鏈表頭節點Node_ptr list_create()函數…

[Rust 基礎課程]猜數字游戲-獲取用戶輸入并打印

創建項目 按照之前的章節講的創建一個 Cargo 項目的方法&#xff0c;自己創建一個名為 guessing_game 的 cargo 項目并執行&#xff0c;確保能成功打印出 Hello World。 編寫代碼 使用 RustRover 打開項目&#xff0c;打開 src/main.rs 文件&#xff0c;我們將在這個文件中編寫…

重讀《人件》Peopleware -(22)Ⅲ 適當人選 Ⅵ 樂在其中(上)

本章以一個小測驗開始&#xff1a;問題1&#xff1a;在過去幾年里&#xff0c;你們組織的年員工流失率是多少&#xff1f; 問題2&#xff1a;替換一個離職員工平均需要多少成本&#xff1f;評分標準如下&#xff1a;如果你對這兩個問題有任何答案&#xff0c;則通過&#xff1b…

Go、Node.js、Python、PHP、Java五種語言的直播推流RTMP協議技術實施方案和思路-優雅草卓伊凡

Go、Node.js、Python、PHP、Java五種語言的直播推流RTMP協議技術實施方案和思路-優雅草卓伊凡既然我們甲方要做直播私有化&#xff0c;既然我們做了這么多年系統&#xff0c;我們對直播的理解很深&#xff0c;那么我們2025年就應該用更先進的技術棧&#xff0c;不然怎么讓我們的…

SpringBoot 集成Mybatis Plus

一、為什么SpringBoot不推薦使用MybatisSpring Boot 不推薦使用 MyBatis&#xff0c;主要源于二者在設計理念、生態融合和開發風格上的差異。Spring Boot 強調“約定優于配置”&#xff0c;追求高效的開發體驗和統一的框架風格。它通過自動配置和依賴注入&#xff0c;將復雜的基…

PI 思維升級 PI設計的典范轉移:從阻抗思維到諧振控制

們先來回想一件事&#xff0c;根據歐姆定律&#xff0c;阻抗是不是越低越好&#xff1f; 代表即使有很大的瞬時電流&#xff0c;瞬間的電壓降也不會超過某個極限&#xff01;理論上是&#xff01; 可是這其實忽略了兩個關鍵的要素&#xff1a;PDN阻抗有諧振&#xff1a;諧振代表…

如何制定企業級服務器安全策略(Security Policy)

制定一套**企業級服務器安全策略&#xff08;Security Policy&#xff09;**對于保護服務器資源、數據安全和業務連續性至關重要。以下是制定安全策略的詳細指南&#xff0c;包括安全策略的核心要素、實施步驟和具體措施&#xff0c;幫助企業構建全面的服務器安全防護體系。1. …

n1 armbian docker compose 部署aipan mysql

apt update apt install docker-compose-plugin -y #安裝docker compose docker compose version Docker Compose version v2.38.2 sudo mkdir -p /sda1/data/mysql/conf.d sudo chown -R 999:999 /sda1/data/mysql # MySQL 用戶 UID 通常為 999 cat docker-compose.yml vers…

RAG情境化分段向量模型voyage-context-3,聚焦分段細節,融入全局文檔上下文

最近看到一個有意思的工作&#xff0c;原文來自&#xff1a; https://blog.voyageai.com/2025/07/23/voyage-context-3/?utm_sourceTWITTER&utm_mediumORGANIC_SOCIAL voyage-context-3&#xff1a;聚焦分段細節&#xff0c;融入全局文檔上下文 概要&#xff1a; Voyage A…

計算機體系結構中的中斷服務程序ISR是什么?

計算機體系結構中的中斷服務程序ISR是什么&#xff1f; 在計算機體系結構中&#xff0c;中斷服務程序&#xff08;Interrupt Service Routine, ISR&#xff09; 是操作系統或硬件直接調用的關鍵代碼模塊&#xff0c;用于響應來自硬件設備、軟件異常或系統事件的中斷信號。其核心…

開源項目XBuilder前端框架

spx-gui/ 配置文件package.json 項目依賴和腳本配置vite.config.ts Vite構建工具配置tsconfig.json TS項目配置主文件tsconfig.app.json 應用程序的TS配置tsconfig.node.json Node.js環境的TS配置index.html 應用入口HTML文件src/ 源碼目錄main.ts 應用入口文件&#xff0c;初始…

0723 單項鏈表

Part 1.完成單向鏈表&#xff0c;并完成下面功能1.單鏈表節點創建鏈表是物理空間上不連續的一個結構&#xff0c;需要創建一個next作為指向下一個節點的指針&#xff0c;所以需要建立一個結構體包含數據域&#xff0c;next指針域&#xff0c;記錄長度的數據域。因為長度只有頭節…

基于 ASP.NET Web 應用程序(.NET Framework)的花店系統

1.1功能模塊實現1.1.1整體結構界面由兩部分組成&#xff1a;左側導航欄、右側內容展示區。使用了 Bootstrap 5 的樣式庫&#xff0c;并結合了 ASP.NET MVC 的 Html.ActionLink 和 Razor 條件判斷語句來動態生成菜單項。1.1.2導航欄功能模塊導航欄基礎結構導航欄基礎結構使用 Bo…