1 cv2.ellipse()橢圓擬合 (方向)
橢圓擬合法的基本思路是:對于給定平面上的一組樣本點,尋找一個橢圓,使其盡可能接近這些樣本點。也就是說,將圖像中的一組數(shù)據(jù)以橢圓方程為模型進行擬合,使某一橢圓方程盡量滿足這些數(shù)據(jù),并求出該橢圓方程的各個參數(shù)。
就橢圓擬合而言,就是先假設橢圓參數(shù),得到每個待擬合點到該橢圓的距離之和,也就是點到假設橢圓的誤差,求出使這個和最小的參數(shù)。
在OpenCV中,函數(shù)cv2.fitEllipse()可以用來構(gòu)建最優(yōu)擬合橢圓,還可以在返回值內(nèi)分別返回橢圓的中心點,軸長,旋轉(zhuǎn)角度信息。使用這種形式,能夠直觀地獲取橢圓的方向等信息。
函數(shù)原型:
(x,y),(MA,ma),angle = cv2.ellipse(points)
?ellipse = cv2.ellipse(points)
參數(shù):
- points: 待擬合直線的點的集合,可以是檢測處理輪廓結(jié)果
返回值:
- ellopse:橢圓
- (x,y):橢圓的中心點
- (MA,ma):橢圓水平方向軸與垂直方向軸的長度
- angle:橢圓的旋轉(zhuǎn)角度
2 cv2.fitLine()直線擬合
直線擬合就是將圖像中的對象擬合成一條直線過程,在OPenCV中擬合直線的API是:
函數(shù)原型:
output = cv2.fitLine(points, distType, param, reps, aeps)
參數(shù):
- points: 待擬合直線的點的集合,可以是檢測處理輪廓結(jié)果
- distType: 距離公式,在進行擬合是,要使輸入點到擬合直線的距離之和最小,常用的用以下幾種:cv2.DIST_L1: 曼哈頓距離;cv2.DIST_L2: 歐式距離;cv2.DIST_C:切比雪夫距離
- param:距離參數(shù),可以設為0
- reps,aeps: 用于表示擬合曲線所需要的徑向和角度精度,通常設為0.01。
返回:
- output:[vx,vy,x,y]的1*4 的數(shù)組,前兩個表示直線的方向,即vy/vx表示斜率,后兩位表示直線上的一個點。
?3? 示例
import cv2
import numpy as np
import matplotlib.pyplot as plt# 1 圖像讀取
img = cv2.imread('C:/Users/xxx/Downloads/arrow.png')
img2 =img.copy()
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 2 轉(zhuǎn)換為二值圖
ret,thresh = cv2.threshold(imgray,127,255,0)# 3 輪廓提取
contours, hierarchy = cv2.findContours(thresh,1,2)# 4 將輪廓繪制在圖像上
temp = np.zeros(img.shape, np.uint8)? # 生成黑背景
img1 = cv2.drawContours(temp, contours, -1, (0,0,255), 2)
cnt=contours[0]# 5 橢圓擬合
ellipse = cv2.fitEllipse(cnt)
img2 = cv2.ellipse(img2,ellipse,(0,255,0),2)# 6 直線擬合
rows,cols = img.shape[:2]
[vx,vy,x,y] = cv2.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
img2 = cv2.line(img2,(cols-1,righty),(0,lefty),(255,0,0),2)
?
# 7 圖像顯示
names = ['原圖','輪廓檢測結(jié)果','橢圓、直線擬合']
images =? [img,img1,img2]plt.figure(figsize=(25.6,9.6))
for i in range(1):
??? for j in range(3):
??????? plt.subplot(1,3,i*3+j+1),plt.imshow(images[i*3+j])
??????? plt.title(names[i*3+j],fontsize=30), plt.xticks([]), plt.yticks([])
??????? num=i*3+j
??????? if num >= len(names)-1:
??????????? breakplt.show()
運行結(jié)果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-756355.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-756355.html
到了這里,關(guān)于opencv(38) 圖像輪廓之七:橢圓擬合和直線擬合的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!