轮廓逼近和拟合

轮廓逼近

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)轮廓逼近和拟合相关推荐

  1. opencv c++ 轮廓逼近与拟合

    1.概念   轮廓逼近:指用越来越多的多边形对轮廓进行拟合,从而获得与轮廓近似的多边形,并获取多边形的形状.目的是为了减少编码点(人话:减少数据量)   拟合:生成最相似的圆或多边形. 2.代码 AP ...

  2. Python,OpenCV应用轮廓逼近算法,检测对象的形状

    上一篇博客,我们学习了如何利用Python.OpenCV计算轮廓的中心,这一节学习仅运用轮廓的基本属性来检测其形状,三角形,正方形,矩形,五边形,圆. (1)利用轮廓逼近,将曲线上的点数减少为更简单的 ...

  3. python使用opencv查找轮廓_(八)OpenCV-Python学习—轮廓查找,绘制和拟合

    针对物体轮廓,opencv还提供了一些相关的函数,来处理轮廓查找,绘制,拟合,以及计算轮廓周长和面积等,详细介绍如下: 1. 寻找和绘制轮廓 opencv的findContours()能寻找图片中的轮 ...

  4. OPENCV图像轮廓检测

    前面在图像转换的时候学到canny算子,可以检测出图像的轮廓信息,但是,该算子检测到的轮廓信息还需要我们手动的用眼睛去识别,而实际工程应用中,我们需要得到轮廓的具体数学信息,这就涉及到今天的主题,图像 ...

  5. 基于OpenCV的轮廓检测(1)

    1.目标 理解什么叫做轮廓 学习如何寻找轮廓以及可视化轮廓 找出轮廓的不同特征,如面积.周长.质心.边框等 将看到许多与轮廓相关的函数. 2.什么叫做轮廓 轮廓可以简单地解释为连接所有连续点(沿着边界 ...

  6. 用实际例子详细探究OpenCV的轮廓检测函数findContours(),彻底搞清每个参数、每种模式的真正作用与含义

    关于OpenCV的轮廓检测函数findContours()各参数的大概意义,已在博文 https://blog.csdn.net/wenhao_ir/article/details/51798533中 ...

  7. Python图片查找轮廓、多边形拟合、最小外接矩形操作实例

    1.概述 经常用到轮廓查找和多边形拟合等opencv操作,因此记录以备后续使用.本文代码中的阈值条件对图片没有实际意义,仅仅是为了测试. 原图为:                            ...

  8. OpenCV 图像轮廓检测

    本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式.轮廓逼近算子等操作. 图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检 ...

  9. opencv 截取轮廓中的图像——实现PS中的抠图功能 Opencv extract area circled by contour

    opencv 截取轮廓中的图像--实现PS中的抠图功能 Opencv extract area circled by contour https://blog.csdn.net/sac761/arti ...

最新文章

  1. oracle查看联机日志,oracle联机日志和归档日志
  2. ajax注册表单用户名实时验证,Ajax注册表单用户名实时验证..doc
  3. defunct 进程占用端口_UAV心跳机制与容器、进程数据采集
  4. Calendar Game POJ - 1082(关于日历的博弈问题)
  5. 安装Linux后windows在哪启动,在Linux下安装windows后解决Linux不能启动能问题
  6. android 技能标签功能_android专业技能总结.doc
  7. java里面的三角函数
  8. 解决:无法添加符号: DSO missing from command line
  9. php 详情页,人物详情页.php
  10. PHPStorm更换主题,调整背景和字体颜色
  11. 如果我是决策者,我会决策做CPU吗?
  12. Atitit 程序设计概论 艾提拉著作 目录 1. 界面ui设计 1 2. 编程语言部分 1 3. 面向对象的程序设计 1 4. 算法章节 数据结构 1 5. 第21章 标准库 2 5.1. 文件i
  13. 2021年安徽全椒中学高考成绩查询,全椒中学2020届高考记录是这样的!
  14. Python - 多个Excel合并 (列不同序 或 列数不同)
  15. 苹果推送证书不受信任解决办法2022年
  16. 一个不用背单词的高效英文学习法
  17. AIGC基础:从VAE到DDPM原理、代码详解
  18. The Willpower Instinct
  19. [$injector:unpr] Unknown provider:--angular.module()函数解答
  20. vue elementui table 复选框

热门文章

  1. STL笔记(二)---空间配置器
  2. 原来这些热门游戏都基于Unity开发,为何Unity集训营越来越受欢迎?
  3. STM32 PWM CCR配置解析
  4. 7.4 PowerBI系列之DAX函数专题-期初期末库存分析
  5. 为什么每个商场都在卖新能源车,特斯拉却频频撤店?
  6. mysql查询星期一到星期日的数据
  7. c语言怎样给数组元素依次赋值,在第一组数组中给数组a的前10个元素依次赋值为1、2、3、···、10;在第2个循环中使数组变为1...
  8. 如何抓住IT行业最后的红利?网络安全为什么是风口行业?
  9. 清华梦的破碎——写给清华的退学申请 王垠
  10. 【计算机与UNIX汇编原理⑦】——DOS/BIOS功能调用【实现两数相加 + Hello World】