opencv将坐标点按逆时针顺序存放

在做项目的时候有时需要对轮廓点按照顺时针或者逆时针存储,假设坐标点保存的数据类型是vector<Point>,现在将其按照逆时针的顺序存放,废话不多说,直接上函数。

#include<iostream>
#include <opencv2\opencv.hpp>using namespace cv;
using namespace std;//若点a大于点b,即点a在点b顺时针方向,返回false,否则返回true
bool PointCmp(Point a, Point b, Point center)
{if (a.x >= 0 && b.x < 0)return false;if (a.x == 0 && b.x == 0)return a.y < b.y;int det = ((a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y));if (det < 0)return false;if (det > 0)return true;double d1 = (a.x - center.x) * (a.x - center.x) + (a.y - center.y) * (a.y - center.y);double d2 = (b.x - center.x) * (b.x - center.y) + (b.y - center.y) * (b.y - center.y);return d1 < d2;
} void ClockwiseSortPoints(vector<Point> &vPoints)
{//计算重心Point center;double X = 0, Y = 0;for (int i = 0; i < vPoints.size(); i++){X += vPoints[i].x;Y += vPoints[i].y;}center.x = (int)X / vPoints.size();center.y = (int)Y / vPoints.size();//冒泡排序for (int i = 0; i < vPoints.size() - 1; i++){for (int j = 0; j < vPoints.size() - i - 1; j++){if (PointCmp(vPoints[j], vPoints[j + 1], center)){Point tmp = vPoints[j];vPoints[j] = vPoints[j + 1];vPoints[j + 1] = tmp;}}}
}
vector<Point> findBiggestContour(Mat binary_image)
{vector<vector<cv::Point>> contours;vector<Vec4i> hierarchy;int largest_area = 0;int largest_contour_index = 0;findContours(binary_image, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);for (int i = 0; i < contours.size(); i++) // iterate through each contour. {double a = contourArea(contours[i], false);  //  Find the area of contourif (a > largest_area) {largest_area = a;largest_contour_index = i;                //Store the index of largest contour}}return contours[largest_contour_index];
}
int main()
{Mat img = imread("25.png", 0);threshold(img, img, 127, 255, CV_THRESH_BINARY);vector<Point> bigestContour;bigestContour = findBiggestContour(img);//提取最大轮廓ClockwiseSortPoints(bigestContour);for(int i = 0; i < bigestContour.size(); i++){cout<<"第"<<i<<"个轮廓点坐标:"<<bigestContour[i].x,bigestContour[i].y<<endl;} return 0;
}

这里说明一下,其实轮廓本身已经是逆时针方向了,因为使用了宏CV_CHAIN_APPROX_NONE,但如果不使用这个宏,就有必要对轮廓排序了,除了对轮廓点可以采用此方法排序外,还可以对凸多边形点进行排序,这样在项目中可以有效的处理我们的数据,平时写博客少,有问题可以沟通,qq385105501。

opencv将坐标点按逆时针顺序存放相关推荐

  1. C语言学习之用指针变量,将数组a中n个整数按相反顺序存放

    将数组a中n个整数按相反顺序存放 int main(){void inv(int *x,int n);//声明inv函数 int i,a[10];for(i=0;i<10;i++){scanf( ...

  2. C语言:有N个数从小到大的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个数。如果不在数组中,打印“not found”。

    /*有N个数从小到大的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个数.如果不在数组中,打印"not found".*/#include<stdio ...

  3. [C语言]指针之数组逆序函数:编写函数invert,将数组中的n个整数按相反顺序存放,要求用指针变量作为函数形参,并用指针的方法遍历该数组。在main函数中输入n个整数,存入数组a中;然后调用上述函

    编写函数invert,将数组中的n个整数按相反顺序存放,要求用指针变量作为函数形参,并用指针的方法遍历该数组. 在main函数中输入n个整数,存入数组a中:然后调用上述函数处理数组a,最后逐个输出数组 ...

  4. 有15个数按从小到大的顺序存放在一个数组中。(折半查找)

    有15个数按从小到大的顺序存放在一个数组中.输入一个数,要求用折半查找法找出该数是数组中第几个元素的值.如果该数不在数组中,输出"不在表中". 折半查找法的原理是:对于一个升序数组 ...

  5. 汇编语言: 试编制一个程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不 是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为buffer的缓冲区中(空 格符不存入),直到接收

    试编制一个程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不 是,则退出程序:如是,则开始接收键入的字符并顺序存放在首地址为buffer的缓冲区中(空 格符不存入),直到接收到第二个空格 ...

  6. c语言 有15个数按由大到小,C++ 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。...

    有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值.如果该数不在数组中,则输出"无此数". 以下是此题的[c++源代码],需要[c ...

  7. 调整文字框顺序,返回顺时针或逆时针顺序

    除了用标准文字检测数据集时,自己的数据集有时文字框点的顺序会不按照顺时针或者逆时针.这会导致训练报错或者可视化时出现问题. 我没找到很方便的代码,所以提供一下我自己写的这个代码,可以将文字框的四个点调 ...

  8. python截取图片的ROI+OpenCV 在坐标中显示图片+鼠标点击图片显示点坐标

    又来做下笔记了.现在我的毕业设计进行到数据处理的阶段,要在乳腺图像上截取4张相同大小的1024*1024图片,并且每张图片都必须覆盖微钙化点,以下是我现在用到的一些简单程序. 1.首先是截图程序如下: ...

  9. 有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...

    作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...

最新文章

  1. ZOJ 1048|POJ 1004|HDU1064 Financial Management
  2. python list append tuple_Python之list、tuple、dict、set
  3. [LeetCode] Maximal Rectangle
  4. 使用sqlserver连接mysql服务_Sqlserver创建连接MySql的链接服务器
  5. 清华王兴再抛神论:为什么教育决定着中国餐饮业质量?
  6. Hadoop学习笔记(一)从官网下载安装包
  7. boost::asio 笔记
  8. 手把手!基于领域预训练和对比学习SimCSE的语义检索(附源码)
  9. linux python 链接 oracle
  10. 聊聊我是如何编程入门的
  11. android gallery效果,Android RecyclerView封装的Gallery效果控件,android galleryview
  12. 微带线特性阻抗计算公式_传输线特性阻抗计算方式
  13. 这样能收录,原理是用的凤凰新闻采集工具
  14. linux 是什么?
  15. iso镜像文件安装linux,详细解说Ubuntu iso安装镜像文件
  16. CentOS调整LVM分区
  17. java解析word示例(支持docx、doc,wps格式)
  18. (R,线性回归)R语言里的模型诊断图(Residuals vs Fitted,Normal QQ , Scale-Location ,Residuals Leverage)
  19. 文件夹自动生成html画廊,在 Photoshop 中创建 Web 照片画廊
  20. 新电脑将软件安装到D盘的操作说明

热门文章

  1. 必不可少!STL源码目录结构分析,附加源码下载链接
  2. Java把xx年xx月xx日(星期x) 上午xx点xx分转换Date类型
  3. 快读的使用方法(实现四类数据快读)
  4. dns劫持,启动chrome就打开垃圾网站
  5. 行为研究:用户行为背后的意义和4点价值
  6. 论坛入口forum.php
  7. 政府采购:国产软件发展的第一推动力
  8. 企业家故事|香港最后一位少爷,走了(下)
  9. LAMP系统构建论文
  10. 中国下一代互联网(CNGI)建设市场投资前景预测与发展战略规划研究报告2021~2027年