opencv橢圓擬合

2021-08-18 09:46:04 字數 2113 閱讀 9686

目標:通過橢圓擬合求出目標長短軸

思路:先用canny計算出待擬合橢圓的邊界座標,opencv中fitellipse函式可通過最小二乘法來擬合乙個橢圓使得點盡量在橢圓上。

如上圖,右邊是拖過canny計算出邊界點資訊,左圖是擬合出來的橢圓。

以下作引數說明

def fit_ellipse(img):

edge = cv2.canny(img,10,150) # 求出邊界

y,x=np.nonzero(edge) # 注:矩陣的座標系表示和繪圖用的座標系不同,故需要做座標轉換

edge_list = np.array([[_x,_y] for _x,_y in zip(x,y)]) # 邊界點座標

_ellipse = cv2.fitellipse(edge_list) # 橢圓擬合

print(_ellipse) # 這兒包含 橢圓的中心座標,長短軸長度(2a,2b),旋轉角度

# 如第一排圖得出的引數((407.63262939453125, 425.8587341308594), (361.6327209472656, 416.6160583496094), 170.43588256835938)

edge_clone=edge.copy()

cv2.ellipse(edge_clone, _ellipse, (255,0,0),5)

roi=get_roi(fundus)

cv2.ellipse(roi, _ellipse, (255,0,0),5)

plt.figure(figsize=(20,20))

plt.subplot(1,4,1)

plt.imshow(edge_clone,'gray')

plt.subplot(1,4,2)

plt.imshow(edge,'gray')

plt.subplot(1,4,3)

plt.imshow(roi)

plt.subplot(1,4,4)

plt.imshow(get_roi(fundus))

disc_map = (result[:,:,0]*255).astype(np.uint8)

cup_map = (result[:,:,1]*255).astype(np.uint8)

fit_ellipse(disc_map)

fit_ellipse(cup_map)

這兒有個注意點:平時我們用cv2.ellipse來畫橢圓的時候,給定的長短軸都是半軸的長度,用cv2.fitellipse擬合出來的是半軸的雙倍長度。在用cv2.ellipse繪製的時候注意,如果直接用cv2.fitellipse擬合出來的引數繪製,可以直接將擬合引數作為cv2.ellipse的引數,而不必將長短軸除以2,如下圖所示。(這兒_ellipse假設是cv2.fitellipse擬合出來的)

那麼我們也可以自己設定好(或者從擬合的引數)來繪製橢圓,就是以自己指定引數來繪製橢圓

可以發現,我這兒是自己指定引數繪製。我前面說了一大堆就是想突出axes這個引數,自己指定的時候是(100,50),如果用擬合出來的_ellipse元組,引數是(200,100)。這也是我實驗時候發現的。所以用cv2.fitellipse擬合出來的引數是長短軸的全長,不是半長

其他繪製的引數比較簡單,這兒說明一下,左上角為原點,橫軸為x軸,縱軸為y軸!angle指以橫軸為起始軸,逆時針旋轉的角度,startangle和endangle都是指定繪製的橢圓的狐的範圍。如下例

opencv 橢圓擬合

include cv.h include highgui.h include using namespace std int slider pos 23 閾值 iplimage image02 0,image03 0,image04 0 void process image int h int ma...

OpenCV 橢圓擬合fitEllipse

本文的主要參考為官方文件opencv249 fitellipse和部落格 opencv中的橢圓擬合 以及 learning opencv 3 page424 425 opencv中提供的橢圓擬合api如下 rotatedrect fitellipse inputarray points 輸入 二維點...

opencv中的橢圓擬合

首先貼乙個最簡單的程式 訪問 建立乙個用於繪製影象的空白圖 cv mat image cv mat ones 480,640,cv 8uc3 設定藍色背景 image.setto cv scalar 100,0,0 輸入擬合點 std vectorpoints points.push back cv...