1. 程式人生 > 程式設計 >Python Opencv輪廓常用操作程式碼例項解析

Python Opencv輪廓常用操作程式碼例項解析

1.顏色空間轉換

使用cv2.cvtColor(input_image ,flag),flag為轉換型別

常用的轉換型別有:

  • BGR和灰度圖的轉換使用 cv2.COLOR_BGR2GRAY
  • BGR和HSV的轉換使用 cv2.COLOR_BGR2HSV

img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

2.二值化

  • ret,dst = cv2.threshold(src,thresh,maxval,type)
  • src:表示的是圖片源(灰度圖)
  • thresh:表示的是閾值(起始值)
  • maxval:表示的是最大值
  • type:表示的是這裡劃分的時候使用的是什麼型別的演算法,常用值為0(cv2.THRESH_BINARY)

返回值

ret:指定的thresh

dst: 目標影象

Python Opencv輪廓常用操作程式碼例項解析

ret,dst = cv2.threshold(img_gray,200,255,cv2.THRESH_BINARY)

3.查詢並繪製輪廓

3.1 cv2.findContours(image,mode,method[,offset])

概述:

尋找一個二值影象的輪廓。注意黑色表示背景,白色表示物體,即在黑色背景裡尋找白色物體的輪廓

引數:

  • image: 8位單通道影象。非零畫素值視為1,所以影象視作二值影象
  • mode: 輪廓檢索的方式
    • cv2.RETR_EXTERNAL: 只檢索外部輪廓
    • cv2.RETR_LIST: 檢測所有輪廓且不建立層次結構
    • cv2.RETR_CCOMP: 檢測所有輪廓,建立兩級層次結構。上面的一層為外邊界,裡面的一層為內孔的邊界資訊。如果內孔內還有一個連通物體,這個物體的邊界也在頂層。
    • cv2.RETR_TREE: 檢測所有輪廓,建立完整的層次結構
  • method: 輪廓近似的方法
    • cv2.CHAIN_APPROX_NONE: 儲存所有的輪廓點
    • cv2.CHAIN_APPROX_SIMPLE: 壓縮水平,垂直和對角線段,只留下端點。 例如矩形輪廓可以用4個點編碼
    • cv2.CHAIN_APPROX_TC89_L1,cv2.CHAIN_APPROX_TC89_KCOS:使用Teh-Chini chain近似演算法
  • offset:(可選引數)輪廓點的偏移量,格式為tuple,如(-10,10)表示輪廓點沿X負方向偏移10個畫素點,沿Y正方向偏移10個畫素點

返回值:

  • contours: 輪廓點。列表格式,每一個元素為一個3維陣列(其形狀為(n,1,2),其中n表示輪廓點個數,2表示畫素點座標),表示一個輪廓
  • hierarchy: 輪廓間的層次關係,為三維陣列,形狀為(1,n,4),其中n表示輪廓總個數,4指的是用4個數表示各輪廓間的相互關係。第一個數表示同級輪廓的下一個輪廓編號,第二個數表示同級輪廓的上一個輪廓的編號,第三個數表示該輪廓下一級輪廓的編號,第四個數表示該輪廓的上一級輪廓的編號

補充: 若想得到輪廓點的集合的列表,可使用

cnt = np.squeeze(contours[0])

3.2 cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineType[,hierarchy[,maxLevel[,offset]]]])

引數:

  • image: 需要繪製輪廓的目標影象,注意會改變原圖
  • contours: 輪廓點,上述函式cv2.findContours()的第一個返回值
  • contourIdx: 輪廓的索引,表示繪製第幾個輪廓,-1表示繪製所有的輪廓
  • color: 繪製輪廓的顏色
  • thickness:(可選引數)輪廓線的寬度,-1表示填充
  • lineType:(可選引數)輪廓線型,包括cv2.LINE_4,cv2.LINE_8(預設),cv2.LINE_AA,分別表示4鄰域線,8領域線,抗鋸齒線(可以更好地顯示曲線)
  • hierarchy:(可選引數)層級結構,上述函式cv2.findContours()的第二個返回值,配合maxLevel引數使用
  • maxLevel:(可選引數)等於0表示只繪製指定的輪廓,等於1表示繪製指定輪廓及其下一級子輪廓,等於2表示繪製指定輪廓及其所有子輪廓
  • offset:(可選引數)輪廓點的偏移量

import cv2
img = cv2.imread('D:/2.jpg',1)

img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,cv2.THRESH_BINARY)

contours,hierarchy = cv2.findContours(dst,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img,-1,(0,0),3)

cv2.imshow('img',img)
cv2.waitKey(0)

4.點與輪廓位置關係

此功能可查詢影象中的點與輪廓之間的最短距離。當點在輪廓外時返回負值,當點在內部時返回正值,如果點在輪廓上則返回零

dist = cv2.pointPolygonTest(cnt,(100,100),True)

檢查(100,100)與輪廓(cnt)的距離

在函式中,第二個引數需要tuple型別;第三個引數是measureDist。 如果為True,則查詢距離. 如果為False,則查詢該點是在內部還是外部或在輪廓上(它分別返回+1,-1,0)

如果不需要到距離,請確保第三個引數為False,因為這是一個耗時的過程。因此,將其設為False可提供2-3倍的加速

5.直線擬合fitline函式

output = cv2.fitLine(InputArray points,distType,param,reps,aeps)

引數:

  • InputArray Points: 待擬合的直線的集合,必須是矩陣形式(如numpy.array)
  • distType: 距離型別。fitline為距離最小化函式,擬合直線時,要使輸入點到擬合直線的距離和最小化。這裡的距離的型別有以下幾種:
    • cv2.DIST_USER : User defined distance
    • cv2.DIST_L1: distance = |x1-x2| + |y1-y2|
    • cv2.DIST_L2: 歐式距離,此時與最小二乘法相同
    • cv2.DIST_C: distance = max(|x1-x2|,|y1-y2|)
    • cv2.DIST_L12: L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))
    • cv2.DIST_FAIR
    • cv2.DIST_WELSCH
    • cv2.DIST_HUBER
  • param: 距離引數,跟所選的距離型別有關,值可以設定為0
  • reps,aeps: 第5/6個引數用於表示擬合直線所需要的徑向和角度精度,通常情況下兩個值均被設定為1e-2

返回值:

output:對於二維直線,輸出output為4維,前兩維代表擬合出的直線的方向,後兩位代表直線上的一點。(即通常說的點斜式直線)

loc = np.array(loc)
output = cv2.fitLine(loc,cv2.DIST_L2,0.01,0.01)
k = output[1] / output[0]
b = output[3] - k * output[2]#k[key]報錯?

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。