/********************************************************************************
*
* 本程序用于示范椭圆拟合。程序找到轮廓,并使用三种方法对其进行椭圆近似拟合。
* 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)
【opencv】示例-fitellipse.cpp 椭圆拟合
最新推荐文章于 2025-05-07 08:17:27 发布