为了账号安全,请及时绑定邮箱和手机立即绑定

使用 fitEllipse 对图像进行椭圆拟合

使用 fitEllipse 对图像进行椭圆拟合

MM们 2021-09-25 09:52:19
使用 OpenCV fitEllipse,我想执行 3900 × 3072 png 图像(Python 3.6.7)的椭圆拟合。作为输入图像,我使用 AMD 14 目录中的图像,该目录分布在以下站点。最终,我想创建一个蒙版,通过将椭圆形状拟合到非零像素值的最大连接区域来从感兴趣的中心区域 (ROI) 裁剪图像。import numpy as npimport cv2def create_ellipse(thresh,cnt):    ellipse = cv2.fitEllipse(cnt) #ここでエラーが出る    thresh = cv2.ellipse(thresh,ellipse,(0,255,255),2)     return threshdef rgb_to_gray(src):     b, g, r = src[:,:,0], src[:,:,1], src[:,:,2]     gray = 0.2989 * r + 0.5870 * g + 0.1140 * b     return gray   im = cv2.imread('AMD1.png')gray = rgb_to_gray(im)gray = cv2.convertScaleAbs(gray)cv2.imwrite("gray.png", gray)height = im.shape[0]width = im.shape[1]cnt = (width/2, height/2)im = np.float32(im)thresh = create_ellipse(im,cnt)虽然我执行了上面的代码,但我得到了如下所示的错误。error                                     Traceback (most recent call last)<ipython-input-46-9f83929ab8df> in <module>()     37 im = np.float32(im)---> 38 thresh = create_ellipse(im,cnt)<ipython-input-46-9f83929ab8df> in create_ellipse(thresh, cnt)      3       4 def create_ellipse(thresh,cnt):----> 5     ellipse = cv2.fitEllipse(cnt)       6           7     #ex : cv2.ellipse(img, (width/2-200, height/2-300), (100, 50), 0, 0, 360, (0, 0, 255), 10)error: OpenCV(3.4.3) /io/opencv/modules/imgproc/src/shapedescr.cpp:305: error: (-215:Assertion failed) n >= 0 && (depth == CV_32F || depth == CV_32S) in function 'fitEllipse'
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

cv2.fitEllipse(...)

    fitEllipse(points) -> retval

    .   @brief Fits an ellipse around a set of 2D points.

    .

    .   The function calculates the ellipse that fits (in a least-squares sense) a set of 2D points best of

    .   all. It returns the rotated rectangle in which the ellipse is inscribed. The first algorithm described by @cite Fitzgibbon95

    .   is used. Developer should keep in mind that it is possible that the returned

    .   ellipse/rotatedRect data contains negative indices, due to the data points being close to the

    .   border of the containing Mat element.

    .

    .   @param points Input 2D point set, stored in std::vector\<\> or Mat

这是一个演示:


#!/usr/bin/python3

# 2018/12/25


import cv2

img = cv2.imread('test.jpg')

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

th, threshed = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)


## findContours, then fitEllipse for each contour.

## 使用 cv2.findContours(...)[-2:] 对 2.x|3.x|4.x 兼容

cnts, hiers = cv2.findContours(threshed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]


for cnt in cnts:

    ellipse = cv2.fitEllipse(cnt)

    cv2.ellipse(img, ellipse, (255,0, 255), 1, cv2.LINE_AA)


cv2.imwrite("dst.png", img)


查看完整回答
反对 回复 2021-09-25
  • 1 回答
  • 0 关注
  • 536 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号