【opencv】示例-fitellipse.cpp 椭圆拟合

C++代码展示了如何使用OpenCV进行轮廓检测,并通过OpenCV原始fitEllipse、AMS方法fitEllipseAMS和Direct方法fitEllipseDirect对轮廓进行椭圆拟合。用户可通过滑动条调整阈值,直观比较不同方法的拟合效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0e7c759d3b1c0828f4ffdcad5788048a.png

b6773adcf5e207cfec1b3c8f0514dc8a.png

0ae3959b305be3411f009d3cd868cfd7.png

/********************************************************************************
 *
 *  本程序用于示范椭圆拟合。程序找到轮廓,并使用三种方法对其进行椭圆近似拟合。
 *  1: OpenCV原始方法fitEllipse,实现了Fitzgibbon 1995提出的方法。
 *  2: 平均平方近似(Approximate Mean Square, AMS)方法fitEllipseAMS,由Taubin 1991提出。
 *  3: 直接最小二乘(Direct Least Square,Direct)方法fitEllipseDirect,由Fitzgibbon 1999提出。
 * 
 *  跟踪条用来指定阈值参数。
 *
 *  白线表示轮廓/输入点,以及用于生成数据的真实椭圆。
 *  1: 蓝线代表使用OpenCV原始方法拟合椭圆。
 *  2: 绿线代表使用AMS方法拟合椭圆。
 *  3: 红线代表使用Direct方法拟合椭圆。
 *
 *  原始作者:  Denis Burenkov
 *  AMS和Direct方法作者:  Jasper Shemilt
 *
 ********************************************************************************/
#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理功能的头文件
#include "opencv2/imgcodecs.hpp" // 包含OpenCV图像编码解码功能的头文件
#include "opencv2/highgui.hpp" // 包含OpenCV高层GUI功能的头文件
#include <iostream> // 包含标准输入输出流库文件


using namespace cv; // 使用OpenCV命名空间
using namespace std; // 使用标准命名空间


class canvas{
public:
    bool setupQ; // 画布是否已经设置的标志
    cv::Point origin; // 画布的原点坐标
    cv::Point corner; // 画布的角点坐标
    int minDims,maxDims; // 画布的最小和最大维度
    double scale; // 缩放比例
    int rows, cols; // 画布的行数和列数
    cv::Mat img; // 画布对应的图像


    void init(int minD, int maxD){
        // 使用最小最大行列尺寸初始化画布
        minDims = minD; maxDims = maxD;
        origin = cv::Point(0,0); // 初始化原点为(0,0)
        corner = cv::Point(0,0); // 初始化角点为(0,0)
        scale = 1.0; // 初始化缩放比例为1
        rows = 0; // 初始化行数为0
        cols = 0; // 初始化列数为0
        setupQ = false; // 设置画布的标志为未设置
    }


    void stretch(cv::Point2f min, cv::Point2f max){
        // 拉伸画布以包括点min和max
        if(setupQ){
            if(corner.x < max.x){corner.x = (int)(max.x + 1.0);};
            if(corner.y < max.y){corner.y = (int)(max.y + 1.0);};
            if(origin.x > min.x){origin.x = (int) min.x;};
            if(origin.y > min.y){origin.y = (int) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值