cv2小記 輪廓特徵

2021-10-02 13:16:28 字數 3209 閱讀 5934

# coding: utf-8

# !/usr/bin/python

"""@file : 輪廓特徵.py

@author : jiaming

@modify time: 2020/2/4 12:49

@contact :

@version : 1.0

@desciption : 查詢輪廓的不同特徵,例如面積,周長,重心,邊界框。

"""import os

import sys

import numpy as np

import cv2

import pprint

from matplotlib import pyplot as plt

rawpath = os.path.abspath(__file__)

currentfile = os.path.basename(sys.ar**[0]

)datapath = rawpath[

:rawpath.find(currentfile)

]+ r'static\\'

"""

矩影象的矩可以幫助我們計算影象的質心,面積

cv2.moments()會將計算得到的矩以乙個字典的形式返回。

"""img = cv2.imread(datapath +

'j.png',0

)ret, thresh = cv2.threshold(img,

127,

255,0)

contours, hierarchy = cv2.findcontours(thresh,1,

2)cnt = contours[0]

m = cv2.moments(cnt)

print

(m)#

# 計算重心

cx =

int(m[

'm10'

]/ m[

'm00'])

cy =

int(m[

'm01'

]/ m[

'm00'

])

"""

輪廓面積

cv2.contourarea(), 也可以使用矩 m['m00']

area = cv2.contourarea(cnt)

"""

"""

輪廓周長

cv2.arclength() 計算得到

perimeter = cv2.arclength(cnt, true)

"""

"""

輪廓近似

將輪廓形狀近似到另外一種由更少點組成的輪廓形狀,新輪廓的點的數目由我們設定

的準確度來決定。

使用的 douglas-peucker 演算法。

epsilon = 0.1*cv2.arclength(cnt, true) 原始輪廓到近似輪廓的最大距離

"""

"""

凸包凸包與近似輪廓相似,雖然有些情況下它們給出的結果是一樣的。

cv2.convechull() 可以用來檢測乙個曲線是否具有凸性缺陷,並能糾正缺陷。

hull = cv2.convexhull(points[, hull[, clockwise[, returnpoints])

points: 我們要傳入的輪廓

hull: 輸出

clockwise: 方向標誌。如果設定為 true,輸出的凸包是順時針方向的。否則為逆時針方向。

returnpoints 預設值為 true,它會返回凸包上點的座標。如果設定為 false。

凸性檢測

函式 cv2.iscontourconvex(),可以用來檢測乙個曲線是不是凸的,它只能返回 true 或 false

k = cv2.iscontourconvex(cnt)

"""

"""

邊界矩形

直邊界矩形: 乙個直矩形,不會考慮物件是否旋轉。

所以邊界的面積不是最小的。可以使用cv2.boundingrect()

x,y,w,h = cv2.boundingrect(cnt)

img = cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

旋轉的邊界矩形:這個邊界矩形是面積最小的,因為它考慮了物件的旋轉。

x,y,w,h = cv2.boundingrect(cnt)

img = cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

"""

"""

最小外接圓

cv2.minenclosingcircle() 可以幫我們找到乙個物件的外切圓,它是所有能夠包括

物件的圓中面積最小的乙個。

(x, y), radius = cv2.minenclosingcircle(cnt)

center = (int(x), int(y))

radius = int(radius)

img = cv2.circle(img, center, radius, (0, 255, 0), 2)

"""

"""

橢圓擬合

cv2.ellipse(),返回值其實就是旋轉邊界矩形的內切圓

ellipse = cv2.fitellipse(cnt)

im = cv2.ellipse(im, ellipse, (0, 255, 0), 2)

"""

"""

直線擬合

我麼可以根據一組點擬合出一條直線,同樣我們也可以為影象中的白色點擬合出一條直線。

[vx, vy, x, y] = cv2.firline(cnt, cv2.dist_l2, 0, 0.01, 0.01)

lefty = int((-x*xy/vx) + y)

righty = int((cols-x)*vy/vx) + y)

img = cv2.line(img, (cols-1, righty), (0, lefty), (0, 255, 0), 2)

"""

cv2小記 初始輪廓

coding utf 8 usr bin python file opencv中的輪廓.py author jiaming modify time 2020 2 4 12 02 contact version 1.0 desciption opencv 中的輪廓 理解什麼是輪廓,學習找輪廓,繪製輪廓...

cv2作弊手冊

img cv2.imread cv2.imshow show img cv2.waitkey cv2.destroyallwindows 視窗只會在呼叫waitkey 函式時才會更新 數學表示 所有的波形都可以由一系列簡單且頻率不同的正弦曲線疊加得到。影象由許多頻率組成,分離不同的頻率來理解影象和提...

安裝CV2,安裝opencv

幾經嘗試,發現並沒有所謂的 cv2 包,需要安裝的是opencv這個包,安裝後就可以import cv2了。方法如下 直接用pip安裝,按windows r 輸入cmd,在cmd環境下輸入 pip install opencv 如果安裝了conda的,按windows r 輸入cmd,在cmd環境下...