opencv —— minEnclosingCircle、fitEllipse 寻找包裹轮廓的最小圆、点集拟合椭圆
寻找包裹轮廓的最小圆:minEnclosingCircle 函数
返回圆应满足:① 轮廓上的点均在圆形空间内。② 没有面积更小的满足条件的圆。
void minEnclosingCircle(InputArray points, Point2f& center, float& radius);
- points,输入的二维点集,可以是 vector 或 Mat 类型。
- center,圆的输出圆心。
- radius,圆的输出半径。
代码示例:
#include<opencv.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/示例图片/7.jpg");
imshow("src", src); //将原图转换为二值图像
Mat bin_img;
cvtColor(src, bin_img, COLOR_BGR2GRAY);
threshold(bin_img, bin_img, , , THRESH_BINARY_INV);
imshow("bin_img", bin_img); //寻找轮廓
vector<vector<Point> >contours;
findContours(bin_img, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE); //寻找包裹轮廓的最小圆
vector<Point2f>centers(contours.size());//圆心
vector<float>radius(contours.size());//半径
Mat dst = Mat::zeros(src.size(), src.type());
RNG rngs = { };
for (int i = ; i < contours.size(); i++) {
//绘制轮廓
Scalar colors = Scalar(rngs.uniform(, ), rngs.uniform(, ), rngs.uniform(, ));
drawContours(dst, contours, i, colors, ); //寻找并绘制最小圆
minEnclosingCircle(contours[i], centers[i], radius[i]);
circle(dst, centers[i], radius[i], colors, );
} imshow("dst", dst);
waitKey();
}
效果演示:

寻找点集拟合椭圆:fitEllipse 函数
需要说明的是,点集拟合椭圆并非最小包围椭圆。返回椭圆并不满足“轮廓上的点均在椭圆包围空间内”这一条件。
其原理是:① 寻找包裹轮廓的最小斜矩阵(minAreaRect() https://www.cnblogs.com/bjxqmy/p/12347355.html)。② 返回斜矩阵内最大的椭圆(矩阵长宽分别做椭圆长轴、短轴)。
RotatedRect fitEllipse(InputArray points);
- 唯一一个参数是输入的二维点集,可以是 vector 或 Mat 类型。
代码示例:
#include<opencv.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/示例图片/7.jpg");
imshow("src", src); //将原图转换为二值图像
Mat bin_img;
cvtColor(src, bin_img, COLOR_BGR2GRAY);
threshold(bin_img, bin_img, , , THRESH_BINARY_INV);
imshow("bin_img", bin_img); //寻找轮廓
vector<vector<Point> >contours;
findContours(bin_img, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE); //寻找包裹轮廓的最小椭圆
vector<RotatedRect>rota_rect(contours.size());
Mat dst = Mat::zeros(src.size(), src.type());
RNG rngs = { };
for (int i = ; i < contours.size(); i++) {
//绘制轮廓
Scalar colors = Scalar(rngs.uniform(, ), rngs.uniform(, ), rngs.uniform(, ));
drawContours(dst, contours, i, colors, ); //寻找并绘制最小椭圆
rota_rect[i] = fitEllipse(contours[i]);
ellipse(dst, rota_rect[i], colors, );
} imshow("dst", dst);
waitKey();
}
效果演示:

opencv —— minEnclosingCircle、fitEllipse 寻找包裹轮廓的最小圆、点集拟合椭圆的更多相关文章
- opencv —— boundingRect、minAreaRect 寻找包裹轮廓的最小正矩形、最小斜矩形
寻找包裹轮廓的最小正矩形:boundingRect 函数 返回矩阵应满足:① 轮廓上的点均在矩阵空间内.② 矩阵是正矩阵(矩形的边界与图像边界平行). Rect boundingRect(InputA ...
- Dlib Opencv cv2.fitEllipse用于人眼轮廓椭圆拟合
dlib库的安装以及人脸特征点的识别分布分别在前两篇博文里面 Dlib Python 检测人脸特征点 Face Landmark Detection Mac OSX下安装dlib (Python) 这 ...
- opencv的实用研究--分析轮廓并寻找边界点
opencv的实用研究--分析轮廓并寻找边界点 轮廓是图像处理中非常常见的.对现实中的图像进行采样.色彩变化.灰度变化之后,能够处理得到的是“轮廓”.它直接地反应你了需要分析对象的边界特 ...
- OpenCV学习代码记录—— Snake轮廓
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- 【计算机视觉】OpenCV篇(9) - 轮廓(寻找/绘制轮廓)
什么是轮廓? 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 轮廓与边缘好像挺像的? 是的,确实挺像,那么区别是什么呢?简而言之,轮廓是连续的,而边缘并不全都连续(见下图示例).其实边缘主要是 ...
- opencv2.4.13+python2.7学习笔记--OpenCV中的图像处理--图像轮廓
阅读对象:无要求. 1.代码 ''' OpenCV中的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.为了更加准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化 ...
- OpenCV入门之寻找图像的凸包(convex hull)
介绍 凸包(Convex Hull)是一个计算几何(图形学)中的概念,它的严格的数学定义为:在一个向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包. 在图像处理过程中,我们 ...
- OpenCV——识别各省份地图轮廓
好久没有发OpenCV的博客了,最近想到了一个识别地图轮廓的方案,就写来试试.(识别中国的28个省份地图轮廓,不考虑直辖市) 首先,我的基本思路是 用最小的矩形将地图的轮廓圈出来,可以根据长方形的长 ...
- OpenCV 学习笔记(14)为轮廓创建边界旋转框和椭圆
https://docs.opencv.org/3.4/de/d62/tutorial_bounding_rotated_ellipses.html 不旋转 #include "opencv ...
随机推荐
- 对于kvm配置ssh
首先我们要让自己的机器开启ssh服务 首先更新源 sudo apt-get update 安装ssh服务 sudo apt-get install openssh-server 检测是否已启动 ps ...
- 内部类、final与垃圾回收,面试时你一说,面试官就知道
内部类并不常用,而且使用起来有一定的定式,比如在下面的InnterDemoByTrhead.java里,我们通过内部类的形式创建线程. 1 public class InnerDemoByThread ...
- Java 使用 UnixSocket 调用 Docker API
在 Docker 官网查阅 API 调用方式 例如:查询正在运行的容器列表,HTTP 方式如下: $ curl --unix-socket /var/run/docker.sock http:/v1. ...
- 史上最简单的的HashTable源码分析
HashTable源码分析 1.前言 Hashtable 一个元老级的集合类,早在 JDK 1.0 就诞生了 1.1.摘要 在集合系列的第一章,咱们了解到,Map 的实现类有 HashMap.Link ...
- 线性最长cover(无讲解)
#include<bits/stdc++.h> using namespace std; ; int n,f[maxn],cover[maxn],R[maxn]; char str[max ...
- 关于不同python版本print不一致的简单解决方案
经常遇到python2.x的print不带括弧,但python3.x必须要带括弧,版本不一致,需要修改,但是面对数以十计的重复劳动,不免望而却步.其他的一些不一样的地方同理. 解决方案: 运用正则化替 ...
- 浅谈synchronized
目录 浅谈synchronized 前言 是什么 格式 同步代码块 同步方法 注意 最后 浅谈synchronized 前言 看多线程的相关书籍的时候,会经常阅读到一个使用前景,就是银行的取钱存钱操作 ...
- Linux后门的几种姿势
转载自 https://evilanne.github.io/2017/08/26/Linux%E5%90%8E%E9%97%A8-%E6%8C%81%E7%BB%AD%E5%85%B3%E6%B3% ...
- linux 修改系统时间 同步网络时间
一.date命令 date -s time 修改系统时钟时间为time 设置时间和日期 例如:将系统日期设定成2018年6月8日的命令 命令 : "date -s 06/08/2018&q ...
- C++读取MNIST数据集
MNIST是一个标准的手写字符测试集. Mnist数据集对应四个文件: train-images-idx3-ubyte: training set images train-labels-idx1- ...