[opencv][cpp] 学习手册3:多边形拟合


文章目录

  • [opencv][cpp] 学习手册3:多边形拟合
    • 1. 多边形拟合示例:approxPolyDP
    • 2. 心得
    • &&_参考
    • &&_问题解决


1. 多边形拟合示例:approxPolyDP

原理
图像截取自课件视频

目的:需要拟合红色的曲线

  1. 连接曲线首尾两端(S0,E)
  2. 对曲线上的每一个点做直线的垂线(取一个方向,比如从起始 S0 点到终点 E)
  3. 每一个垂线都有长度L,当某一个曲线上的点对应的 L 大于阈值 T,那么就记录下这个点 {Sn}
  4. 以这个点 Sn 为新的起点,连接 E,重复 1
  5. 得到了 {Sn} = {S1, S2, … ,Sn} 以及 E,这些点既是曲线的拟合点。
  6. T 越小,拟合越精准。

代码

/**
Created by jacob on 12/31/20.
*/#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/utils/logger.hpp>using namespace std;
using namespace cv;namespace cvlog = cv::utils::logging;int main() {cvlog::setLogLevel(cvlog::LOG_LEVEL_INFO);string filename = "../img/book.jpg";Mat src = imread(filename, IMREAD_COLOR);resize(src, src, Size(src.cols / 2, src.rows / 2));// 1.将彩色图像转成灰度图像Mat grayImg;cvtColor(src, grayImg, COLOR_BGR2GRAY);imshow("grayImg", grayImg);// 2. 转成二值图(黑底白字,白底黑字有不同的处理方式)Mat binary;threshold(grayImg, binary, 0, 255, THRESH_BINARY | THRESH_TRIANGLE);imshow("binary1", binary);// 膨胀操作(可选)Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));dilate(binary, binary, kernel, Point(-1, -1), 4);erode(binary, binary, kernel, Point(-1, -1), 4);bitwise_not(binary, binary);imshow("binary dilate", binary);// 定义一个画布,用于保存最大轮廓图像Mat maxImg = cv::Mat::zeros(src.size(), CV_8UC3);// 3. 找出工牌的轮廓vector<vector<Point>> contours;vector<cv::Vec4i> hierarchy;findContours(binary, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);CV_LOG_INFO(NULL, "contours size: " << contours.size())// 定义一个变量,存储所有多边形轮廓vector<vector<Point>> polyContours;for (int i = 0; i < contours.size(); ++i) {// 当前的轮廓所有的点vector<Point> contour = contours[i];
//        CV_LOG_INFO(NULL, "contour: [" << i << "]\n" << contour)// 计算面积double area = contourArea(contour);if (area > 10000) {// 在一个空白的图像中画出轮廓drawContours(maxImg, contours, i, Scalar(0, 0, 255), 3);// 根据轮廓,拟合出多边形出来vector<Point> polyPoint;approxPolyDP(contour, polyPoint, 100, true);CV_LOG_INFO(NULL, "拟合结果点的数量:" << polyPoint.size())polyContours.push_back(polyPoint);drawContours(maxImg, polyContours, -1, Scalar(0, 255, 255), 1);drawContours(src, polyContours, -1, Scalar(0, 255, 255), 1);}}// 输出四边形拟合点vector<Point> polyPoint = polyContours[0];for (int j = 0; j < polyPoint.size(); ++j) { // 左上角: 1, 右上角 0 左下角 2 右下角3cout << "点:" << polyPoint[j] << endl;}// 使用霍夫直线Mat maxGrayImg;cvtColor(maxImg, maxGrayImg, COLOR_BGR2GRAY);// 4. 找到边缘的交点vector<Point2f> sourcePoints = {polyPoint[1], polyPoint[0], polyPoint[2], polyPoint[3]};vector<Point2f> targetPoints = {Point2f(0, 0), Point2f(480, 0), Point2f(0, 640), Point2f(480, 640)};// 5. 运用透视变换Mat m = getPerspectiveTransform(sourcePoints, targetPoints);Mat dst;warpPerspective(src, dst, m, Size(480, 640));imshow("maxImg", maxImg);imshow("src", src);imshow("dst", dst);waitKey(0);return 0;
}

运行结果


2. 心得

  1. 没有标准化的处理方法
  2. 要对图像进行预处理,resize,dilate,erode,开闭处理等
  3. 此示例中对于白底黑字,黑底白字的处理方式不同,前者在预处理后应该需要进行一次二值图反转操作 bitwise_not

&&_参考

链接:opencv对二值图像进行颜色反色操作


&&_问题解决

[opencv][cpp] 学习手册3:多边形拟合相关推荐

  1. OpenCV 图像处理学习手册:1~5

    原文:Learning Image Processing with OpenCV 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MT ...

  2. opencv传统分割算法总结(多边形拟合,水平投影,直线检测)

    最近我发现,在很多特定问题上传统的分割方法挺方便的,比如分割打印字体文件,网站爬下来的表格图像,pdf中的特定格式文件等.在实战中,我总结了几点记录一下.主要采用opencv-python来应用这些算 ...

  3. 我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合

    一.贝塞尔曲线基础知识 给一系列顶点,如果只是用直线将其中的各个点依次连接起来,最终形成一个折线图,这种很容易实现.但是现实中事物的变化往往具有连续的特性,即使是给定了一系列离散的点,基于以往的生活经 ...

  4. opencv进阶学习笔记12:轮廓发现和对象测量

    基础版笔记目录: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 轮廓发现 1轮廓发现介绍 基础 ...

  5. opencv 图像去噪学习总结

    OpenCV图像处理篇之图像平滑 图像平滑算法 程序分析及结果 图像平滑算法 图像平滑与图像模糊是同一概念,主要用于图像的去噪.平滑要使用滤波器,为不改变图像的相位信息, 一般使用线性滤波器,其统一形 ...

  6. Python3 OpenCV4 计算机视觉学习手册:1~5

    原文:Learning OpenCV 4 Computer Vision with Python 3 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集] ...

  7. OpenCV示例学习(二): 基本图形绘制算子:line(),circle(),fillPoly(), ellipse()

    OpenCV示例学习(二): 基本图形绘制算子:line(),circle(),fillPoly(), ellipse() #include <opencv2/opencv.hpp>usi ...

  8. 【计算机视觉】opencv入门学习笔记Part.1

    [计算机视觉]opencv入门学习笔记Part.1 1 前言 1.1 opencv概述(摘取自百度百科) 1.2 图像概念引入 1.3 安装opencv库 2 图像基本操作 2.1 图像的读取 2.2 ...

  9. Pandas 学习手册中文第二版:1~5

    原文:Learning pandas 协议:CC BY-NC-SA 4.0 译者:飞龙 一.Pandas 与数据分析 欢迎来到<Pandas 学习手册>! 在本书中,我们将进行一次探索我们 ...

最新文章

  1. linux dd命令制作u盘启动_制做linux启动U盘
  2. 计算机导论第一章试题及答案,计算机导论第一章试题
  3. redis——对项目的一些优化方案
  4. mysql查看编码_mysql 字符编码的查看与修改
  5. 大前端技术选型 Native原生iOS, Android, React-Native, Flutter, 微信小程序, HTML5
  6. Python 制作动态图
  7. Linux安装glassfish、利用glassfish部署应用
  8. Android 字体自适应屏幕的方法
  9. 【计算机系统结构】第3章 流水线技术问答题
  10. maya模型导入UE4,如何做到等比导入
  11. C++ 使用Poco库操作 json 文件
  12. 【unittest学习】unittest框架主要功能
  13. C语言期末考试测试题及答案
  14. uM计算机组成原理,计算机组成原理_课程设计报告.doc
  15. 易經大意(7) 三和 韓長庚 著
  16. 6580: Splitting Pile(中石油)
  17. arduino2560 digitalWrite原型分析
  18. 黑科技还是流氓应用?有些App,通知关不掉!
  19. 【有利可图网】PS教程:把图片做出透视效果
  20. 解决win7打印机共享 出现“无法保存打印机设置,操作无法完成(错误0x000006d9)...

热门文章

  1. 6JS库-前端框架(库)-jQuery选择器
  2. Python爬虫实战:爬取YY上漂亮小姐姐视频
  3. 开发、测试、测试开发
  4. python基础第二课(小白piao分享)
  5. 如何从Windows 10注销其他用户
  6. GitHub-demo:Image-Stitching
  7. 成语接龙和唐诗背诵文字游戏开发
  8. [Python中的除法、除法取整、除法取余] [运算符分别为:/、//、%]
  9. 耶鲁大学宣布推翻了进化论?科学界发文,“进化随机性”或被证伪
  10. 电力系统强大的Gurobi 求解器的学习(PythonMatlab)