TShopping

 找回密碼
 註冊
搜索
查看: 1190|回復: 0
打印 上一主題 下一主題

[教學] python opencv入門輪廓

[複製鏈接]
跳轉到指定樓層
1#
發表於 2020-12-15 20:19:52 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook

目標
理解什麼是輪廓
找輪廓、繪製輪廓
學習如下函數cv2.findContours(), cv2.drawContours()


什麼是輪廓?
輪廓可以理解為將所有連續的像素點(沿著邊界)連接咋我一起的曲線,這些像素有相同的顏色或者灰度。輪廓在形狀分析和物體識別上有重要應用。

  • 為了提高精確度、要使用二值圖像。尋找輪廓前,要進行閾值化處理或者canny邊緣檢測
  • 查找輪廓會修改原始圖像,所以原始圖像要備份
  • 要找的物體應該是白色的,在黑色的背景當中
  1. import numpy as np
  2. import cv2

  3. im = cv2.imread('3.jpg')
  4. imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
  5. ret,thresh = cv2.threshold(imgray,127,255,0)
  6. image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

  7. cv2.imshow('res',image)

  8. cv2.waitKey(0)
複製代碼

cv2.findContours()輸入三個參數,第一個參數是輸入圖像,第二個參數是輪廓查找方式,第三個參數是輪廓近似方法。
返回值有三個,第一個是圖像(二值),第二個是純輪廓,第三個是輪廓層次

返回的純輪廓是一個python的列表,此處存儲所有圖像中的輪廓,每一個輪廓都是numpy數組,包含檢測物體邊界點


新版OPENCV只有兩個參數,才能正常動作

  1. contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
複製代碼


如何繪製輪廓?
cv2.drawContours()函數來繪製輪廓,根據用戶提供的邊界點繪製任何形狀。
輸入參數為,原始圖像,輪廓(列表),輪廓索引(繪製獨立輪廓時有用,-1繪製所有輪廓)
,輪廓顏色,輪廓厚度等等。

在圖像中繪製所有輪廓

  1. import numpy as np
  2. import cv2

  3. im = cv2.imread('1.jpg')
  4. imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
  5. ret,thresh = cv2.threshold(imgray,127,255,0)
  6. image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
  7. img = cv2.drawContours(im, contours, -1, (0,255,0), 3)

  8. cv2.imshow('res',img)

  9. cv2.waitKey(0)
複製代碼

繪製第四個輪廓

  1. import numpy as np
  2. import cv2

  3. im = cv2.imread('1.jpg')
  4. imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
  5. ret,thresh = cv2.threshold(imgray,127,255,0)
  6. image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
  7. img = cv2.drawContours(im, contours, 3, (0,255,0), 3)

  8. cv2.imshow('res',img)

  9. cv2.waitKey(0)
複製代碼

多數情況下這樣使用,與上面結果一樣

  1. import numpy as np
  2. import cv2

  3. im = cv2.imread('1.jpg')
  4. imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
  5. ret,thresh = cv2.threshold(imgray,127,255,0)
  6. image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
  7. cnt = contours[3]
  8. img = cv2.drawContours(im, [cnt], 0, (0,255,0), 3)

  9. cv2.imshow('res',img)

  10. cv2.waitKey(0)
複製代碼

輪廓近似方法

cv2.findCountours()函數的第三個參數,是什麼意思?
輪廓是形狀具有相同灰度的邊界值,在輪廓中會存儲所有邊界上的(x,y)坐標。但是不一定需要全部存儲,這時用參數來控制。

參數在設置為cv2.CHAIN_APPROX_NONE時所有邊界點會被存儲,但是事實上並不一定需要那麼多,例如邊界是一條直線時,你不需要直線上的所有點,有兩個端點即可,這就是cv2.CHAIN_APPROX_SIMPLE參數提供的,它會去電多餘的點。


文章出處



 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-19 12:31 , Processed in 0.053933 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表