# 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環境下...