opencv(38) 图像轮廓之七:椭圆拟合和直线拟合

这篇具有很好参考价值的文章主要介绍了opencv(38) 图像轮廓之七:椭圆拟合和直线拟合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 cv2.ellipse()椭圆拟合 (方向)

椭圆拟合法的基本思路是:对于给定平面上的一组样本点,寻找一个椭圆,使其尽可能接近这些样本点。也就是说,将图像中的一组数据以椭圆方程为模型进行拟合,使某一椭圆方程尽量满足这些数据,并求出该椭圆方程的各个参数。

就椭圆拟合而言,就是先假设椭圆参数,得到每个待拟合点到该椭圆的距离之和,也就是点到假设椭圆的误差,求出使这个和最小的参数。

在OpenCV中,函数cv2.fitEllipse()可以用来构建最优拟合椭圆,还可以在返回值内分别返回椭圆的中心点,轴长,旋转角度信息。使用这种形式,能够直观地获取椭圆的方向等信息。

函数原型:

(x,y),(MA,ma),angle = cv2.ellipse(points)

 ellipse = cv2.ellipse(points)

参数:

  1. points: 待拟合直线的点的集合,可以是检测处理轮廓结果

返回值:

  1. ellopse:椭圆
  2. (x,y):椭圆的中心点
  3. (MA,ma):椭圆水平方向轴与垂直方向轴的长度
  4. angle:椭圆的旋转角度

2 cv2.fitLine()直线拟合

直线拟合就是将图像中的对象拟合成一条直线过程,在OPenCV中拟合直线的API是:

函数原型:

output = cv2.fitLine(points, distType, param, reps, aeps)

参数:

  1. points: 待拟合直线的点的集合,可以是检测处理轮廓结果
  2. distType: 距离公式,在进行拟合是,要使输入点到拟合直线的距离之和最小,常用的用以下几种:cv2.DIST_L1: 曼哈顿距离;cv2.DIST_L2: 欧式距离;cv2.DIST_C:切比雪夫距离
  3. param距离参数,可以设为0
  4. reps,aeps用于表示拟合曲线所需要的径向和角度精度,通常设为0.01

返回:

  1. output[vx,vy,x,y]1*4 的数组,前两个表示直线的方向,即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 转换为二值图
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 = ['原图','轮廓检测结果','椭圆、直线拟合']
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:
            break

plt.show()

运行结果如下:

opencv椭圆拟合,opencv,人工智能,计算机视觉文章来源地址https://www.toymoban.com/news/detail-756355.html

到了这里,关于opencv(38) 图像轮廓之七:椭圆拟合和直线拟合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Opencv(C++)笔记--绘制直线、矩形、椭圆、圆、填充多边形、绘制字体和随机产生坐标点

    目录 1--cv::line()绘制直线 2--cv::Rect()绘制矩形 3--cv::ellipse()绘制椭圆 4--cv::circle()绘制圆 5--cv::fillPoly()填充多边形 6--cv::putText()绘制字体 6--cv::RNG随机产生坐标点 使用 cv::Point p1 定义坐标点; 使用 cv::line() 绘制直线,传入的参数依次为:背景图、两个点的坐标、直线的颜色、直线

    2024年02月14日
    浏览(38)
  • OpenCV(三十七):拟合直线、三角形和圆形

    1.点集拟合的含义        点集拟合是一种通过拟合函数或曲线来近似描述给定离散数据点的技术,在点集拟合中,可以使用不同的函数或曲线拟合方法来拟合直线、三角形和圆形。 直线拟合 :对于给定的二维数据点集合,可以使用最小二乘法来拟合一条直线。 三角形拟合

    2024年02月03日
    浏览(41)
  • 【OpenCV-Python】——边缘和轮廓&Laplacian/Sobel/Canny边缘检测&查找/绘制轮廓及轮廓特征&霍夫直线/圆变换

    目录 前言: 1、边缘检测 1.1 Laplacian边缘检测  1.2 Sobel边缘检测  1.3 Canny边缘检测 2、图像轮廓 2.1 查找轮廓  2.2 绘制轮廓 2.3 轮廓特征 3、霍夫变换 3.1 霍夫直线变换  3.2 霍夫圆变换 总结: 图像的边缘是指图像中灰度值急剧变化的位置,边缘检测的目的是为了绘制边缘线条。

    2024年01月23日
    浏览(39)
  • OpenCV快速入门:目标检测——轮廓检测、轮廓的距、点集拟合和二维码检测

    在当今数字化时代,计算机视觉的崛起使得目标检测成为科技领域中的一项关键技术。本文将带您快速入门OpenCV中的目标检测,深入探讨轮廓检测、轮廓的距、点集拟合以及二维码检测等核心概念。 OpenCV,作为一种强大的开源计算机视觉库,为开发者提供了丰富的工具和算法

    2024年01月16日
    浏览(41)
  • Opencv之RANSAC算法用于直线拟合及特征点集匹配详解

    讲述Ransac拟合与最小二乘在曲线拟合上的优缺点 讲述在进行特征点匹配时,最近邻匹配与Ransac匹配的不同之处 另外,Ransac也被用于椭圆拟合、变换矩阵求解等 1.1 原理 RANSAC(RANdom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的

    2024年02月05日
    浏览(29)
  • 利用OpenCV与Qt5构建卡尺拟合直线工具(C++实现)

    基于OpenCV与Qt5构建卡尺拟合直线工具 博主近期基于海康Vision Master4.0做了一个工业视觉工程项目,其中就使用到了海康VM的找直线工具,然后博主根据其中的技术原理,也仿照开发了一个类似的功能,基于OpenCV和Qt5构建一个卡尺找直线的工具。卡尺找直线是在计算机视觉领域中

    2024年02月08日
    浏览(36)
  • OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形

    轮廓近似(Contour Approximation)是指对轮廓进行逼近或拟合,得到近似的轮廓。在图像处理中,轮廓表示了图像中物体的边界,因此轮廓近似可以用来描述和识别物体的形状。 多边形拟合(Approximating Polygons)是将轮廓逼近成一个由直线段构成的多边形。常见的有最小包围矩形

    2024年02月10日
    浏览(31)
  • opencv--轮廓拟合函数 boundingRect(),minAreaRect(),minEnclosingCircle(),fitEllipse(),fitLine()

    目录 1.cv2.boundingRect() 2.cv2.minAreaRect() 3. cv2.minEnclosingCircle() 4.cv2.fitEllipse()  5.cv2.fitLine()   在计算轮廓时,可能并不需要实际的轮廓,而仅需要一个接近于轮廓的近似多边形。OpenCV提供了多种计算轮廓近似多边形的方法。 能够返回包围轮廓的矩形的边界信息。 函数样式: retv

    2024年02月16日
    浏览(26)
  • OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合

    目录 1.轮廓外接最大矩形boundingRect() 2.轮廓外接最小矩形minAreaRect() 3.轮廓外接多边形approxPolyDP() 1.轮廓外接最大矩形boundingRect() Rect cv::boundingRect ( InputArray array ) array:输入的灰度图像或者2D点集,数据类型为vectorPoint或者Mat。 示例代码:  轮廓外接最大矩形的结果: 2.轮廓外接

    2024年02月09日
    浏览(28)
  • C++opencv找圆心?看着一篇,一定有你要(边缘轮廓检测,拟合,凸包)找出相应的轮廓或者全部轮廓画外界圆轮廓并且标出轮廓中心

    注意这种面积筛选有一个弊端就是比如有两个轮廓, A轮廓为500 B轮廓为300 当面积设置为 area400时就可以筛选出面积小于300的所有轮廓 反之大于300的轮廓 如果有两个圆轮廓一大一小,可能就只能保留一个了 如果知道这两个形状的轮廓面积,或许可以利用 逻辑与  进行筛选。

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包