😶?🌫?😶?🌫?😶?🌫?😶?🌫?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或255 | 1 | 背景/前景分明,適合分析形狀 | 查找輪廓、區域分析 |
輪廓數據 | 一組點坐標 | 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
更新不易,希望得到友友的三連支持一波。收藏這篇文章,意味著你將永久擁有它,無論何時何地,都可以立即找到重新閱讀;關注博主,意味著無論何時何地,博主將永久和你一起學習進步,為你帶來有價值的內容。