轮廓逼近和拟合

轮廓逼近

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. 苹果的工作官方检索地址
  2. rac下asm管理的表空间-数据文件的重命名
  3. java 弹出下载_java如何实现下载弹出的对话框
  4. 【面向对象设计的5个原则】
  5. IntelliJ IDEA 14 创建maven项目二
  6. 有关Silverlight TreeView组件的研究[2]——Silverlight学习笔记(7)
  7. db2的jdbc驱动
  8. 安卓系统使用chrome插件(以yandex安装油猴为例)
  9. macOS系统如何读写NTFS格式的硬盘
  10. 稳定好用的短连接生成平台,支持API批量生成
  11. 技术人员如何创业(2)---合伙人的模式
  12. 解决Sublime Text菜单栏和标签栏不见问题
  13. SQL Server数据库技术期末大作业 机票预定信息系统
  14. python选题背景_选题背景和意义
  15. Centos 系统折腾
  16. 2021全球与中国光纤熔接机市场现状及未来发展趋势
  17. 金蝶K/3产品各版本引入/引出Excel文件时出现意外错误的提示,或未正确安装Excel的提示
  18. 人工神经元算法视频教学,人工智能神经网络算法
  19. elasticsearch 深入 —— 结构化搜索
  20. 看新闻的时候,你们手机都用什么软件?

热门文章

  1. I need tests now!
  2. 经典查询练手第四篇(不懂装懂,永世饭桶!)
  3. 电子专利“对外服务”进不了难题也解决了
  4. 20种让脸美白的简单方法
  5. 诸葛亮为什么难以入围千古名相之列
  6. 4.5 用自定义函数将字符串中的 大写字母 改写成小写字母 其他字符不动 然后输出
  7. Python的模块调用
  8. IOS深入学习(12)之Archiving
  9. 7款特殊版手机电脑磁力软件安装包下载,包括qBittorrent
  10. 制作适合手机浏览的网页