Opencv-(35)轮廓逼近和拟合
轮廓逼近和拟合
轮廓逼近
OpenCV提供了一个函数approxPolyDP()来对每个轮廓逼近它的的真实几何形状,从而通过轮廓逼近的输出结果判断一个对象是什么形状,本质上说减少编码点
代码演示
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;void fit_circle_demo(Mat& image);
int main(int argc, char** argv) {Mat src = imread("D:/ps/35.png");if (src.empty()) {printf("could not find image file");return -1;}// 二值化GaussianBlur(src, src, Size(3, 3), 0);Mat gray, binary;cvtColor(src, gray, COLOR_BGR2GRAY);threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);// 轮廓发现imshow("binary", binary);vector<vector<Point>> contours;vector<Vec4i> hirearchy;findContours(binary, contours, hirearchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());// 多边形逼近演示程序for (size_t t = 0; t < contours.size(); t++) {Moments mm = moments(contours[t]);double cx = mm.m10 / mm.m00;double cy = mm.m01 / mm.m00;circle(src, Point(cx, cy), 3, Scalar(255, 0, 0), 2, 8, 0);double area = contourArea(contours[t]);double clen = arcLength(contours[t], true);Mat result;approxPolyDP(contours[t], result,6, true);printf("corners : %d , contour area : %.2f, contour length : %.2f \n", result.rows, area, clen);if (result.rows == 6) {putText(src, "poly", Point(cx, cy - 10), FONT_HERSHEY_PLAIN, 1.0, Scalar(0, 0, 255), 1, 8);}if (result.rows == 4) {putText(src, "rectangle", Point(cx, cy - 10), FONT_HERSHEY_PLAIN, 1.0, Scalar(0, 255, 255), 1, 8);}if (result.rows == 3) {putText(src, "triangle", Point(cx, cy - 10), FONT_HERSHEY_PLAIN, 1.0, Scalar(255, 0, 255), 1, 8);}if (result.rows > 10) {putText(src, "circle", Point(cx, cy - 10), FONT_HERSHEY_PLAIN, 1.0, Scalar(255, 255, 0), 1, 8);}}imshow("find contours demo", src);waitKey(0);destroyAllWindows();return 0;
}
轮廓拟合
拟合圆,生成最相似的圆或者椭圆
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;void fit_circle_demo(Mat& image);
int main(int argc, char** argv) {Mat src = imread("D:/ps/35.1.png");if (src.empty()) {printf("could not find image file");return -1;}fit_circle_demo(src);waitKey(0);destroyAllWindows();return 0;
}void fit_circle_demo(Mat& image) {// 二值化Mat gray, binary;cvtColor(image, gray, COLOR_BGR2GRAY);threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);// 轮廓发现imshow("binary", binary);vector<vector<Point>> contours;vector<Vec4i> hirearchy;findContours(binary, contours, hirearchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());// 拟合圆或者椭圆for (size_t t = 0; t < contours.size(); t++) {// drawContours(image, contours, t, Scalar(0, 0, 255), 2, 8);RotatedRect rrt = fitEllipse(contours[t]);float w = rrt.size.width;float h = rrt.size.height;Point center = rrt.center;circle(image, center, 3, Scalar(255, 0, 0), 2, 8, 0);ellipse(image, rrt, Scalar(0, 255, 0), 2, 8);}imshow("fit result", image);
}
相关API
Opencv-(35)轮廓逼近和拟合相关推荐
- opencv c++ 轮廓逼近与拟合
1.概念 轮廓逼近:指用越来越多的多边形对轮廓进行拟合,从而获得与轮廓近似的多边形,并获取多边形的形状.目的是为了减少编码点(人话:减少数据量) 拟合:生成最相似的圆或多边形. 2.代码 AP ...
- Python,OpenCV应用轮廓逼近算法,检测对象的形状
上一篇博客,我们学习了如何利用Python.OpenCV计算轮廓的中心,这一节学习仅运用轮廓的基本属性来检测其形状,三角形,正方形,矩形,五边形,圆. (1)利用轮廓逼近,将曲线上的点数减少为更简单的 ...
- python使用opencv查找轮廓_(八)OpenCV-Python学习—轮廓查找,绘制和拟合
针对物体轮廓,opencv还提供了一些相关的函数,来处理轮廓查找,绘制,拟合,以及计算轮廓周长和面积等,详细介绍如下: 1. 寻找和绘制轮廓 opencv的findContours()能寻找图片中的轮 ...
- OPENCV图像轮廓检测
前面在图像转换的时候学到canny算子,可以检测出图像的轮廓信息,但是,该算子检测到的轮廓信息还需要我们手动的用眼睛去识别,而实际工程应用中,我们需要得到轮廓的具体数学信息,这就涉及到今天的主题,图像 ...
- 基于OpenCV的轮廓检测(1)
1.目标 理解什么叫做轮廓 学习如何寻找轮廓以及可视化轮廓 找出轮廓的不同特征,如面积.周长.质心.边框等 将看到许多与轮廓相关的函数. 2.什么叫做轮廓 轮廓可以简单地解释为连接所有连续点(沿着边界 ...
- 用实际例子详细探究OpenCV的轮廓检测函数findContours(),彻底搞清每个参数、每种模式的真正作用与含义
关于OpenCV的轮廓检测函数findContours()各参数的大概意义,已在博文 https://blog.csdn.net/wenhao_ir/article/details/51798533中 ...
- Python图片查找轮廓、多边形拟合、最小外接矩形操作实例
1.概述 经常用到轮廓查找和多边形拟合等opencv操作,因此记录以备后续使用.本文代码中的阈值条件对图片没有实际意义,仅仅是为了测试. 原图为: ...
- OpenCV 图像轮廓检测
本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式.轮廓逼近算子等操作. 图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检 ...
- opencv 截取轮廓中的图像——实现PS中的抠图功能 Opencv extract area circled by contour
opencv 截取轮廓中的图像--实现PS中的抠图功能 Opencv extract area circled by contour https://blog.csdn.net/sac761/arti ...
最新文章
- 苹果的工作官方检索地址
- rac下asm管理的表空间-数据文件的重命名
- java 弹出下载_java如何实现下载弹出的对话框
- 【面向对象设计的5个原则】
- IntelliJ IDEA 14 创建maven项目二
- 有关Silverlight TreeView组件的研究[2]——Silverlight学习笔记(7)
- db2的jdbc驱动
- 安卓系统使用chrome插件(以yandex安装油猴为例)
- macOS系统如何读写NTFS格式的硬盘
- 稳定好用的短连接生成平台,支持API批量生成
- 技术人员如何创业(2)---合伙人的模式
- 解决Sublime Text菜单栏和标签栏不见问题
- SQL Server数据库技术期末大作业 机票预定信息系统
- python选题背景_选题背景和意义
- Centos 系统折腾
- 2021全球与中国光纤熔接机市场现状及未来发展趋势
- 金蝶K/3产品各版本引入/引出Excel文件时出现意外错误的提示,或未正确安装Excel的提示
- 人工神经元算法视频教学,人工智能神经网络算法
- elasticsearch 深入 —— 结构化搜索
- 看新闻的时候,你们手机都用什么软件?