当前位置:网站首页>【OpenCV】-物体的凸包
【OpenCV】-物体的凸包
2022-08-10 18:16:00 【我菜就爱学】
1、 凸包
什么是凸包?
解释:给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸边形,它是包含点集中所有的点。
如下:用人手图来举例说明凸缺陷概念。手周围深色的线描画出凸包,A到H被标出的区域是凸包的各个“缺陷”,这些凸度缺陷提供了手以及手状态的特征表现的方法。
2、寻找凸包:convexHull()函数
说明:convexHull()函数用于寻找图像点集中的凸包。
void convexHull(InputArray points,OutputArray hull,bool clockwise=false,bool returnPoints=true)
- 第一个参数:输入的二维点集,可以填Mat类型或者std::vector
- 第二个参数:输出参数,函数调用后找到的凸包。
- 第三个参数:操作方向的标识符。当此标识符为True时,输出的凸包为顺时针方向。否则为逆时针方向。
- 第四个参数:操作标识符,默认值True。当标识符为真时,函数返回各个凸包的各个点。否则,它返回凸包各点的指数。
3、函数解析之theRNG()
函数说明:返回默认的随机数生成器。如果需要使用生成器获得一个随机数或者初始化一个数组,可以使用 randu 或者 randn
代替。但想要在一个循环中产生很多随机数,那么使用此函数检索生成器,会很快。
RNG &rng = theRNG(); //用其引用来接收theRNG函数返回的随机数生成器(RNG就是随机数生成器的类)
4 、circle()函数【回忆】
void circle(CV_IN_OUT Mat& image, Point center, int radius, const Scalar& color, int thickness=1, int lineType=8);
- image:为图像,单通道多通道都行,不需要特殊要求
- center:为画圆的圆心坐标
- radius:为圆的半径
- color:为设定圆的颜色,比如用CV_RGB(255, 0,0)设置为红色, CV_RGB(255,255,255)设置为白色,CV_RGB(0, 0,0)设置为黑色
- thickness:为设置圆线条的粗细,值越大则线条越粗,为负数则是填充效果,-1表示绘制实心圆
- lineType:表示线形。OpenCV中有三种可以选择LINE_4、LINE_8、LINE_AA。其中LINE_4表示采用4邻接的方式绘制,LINE_8表示采用8邻接的方式绘制,LINE_AA表示高斯滤波抗锯齿。
5、基础示例程序:凸包检测基础
说明:随机生成3~103个坐标值随机的彩色点,然后将这些点连接起来
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
//初始化变量和随机值
Mat image(500, 500, CV_8UC3);
RNG & rng = theRNG();
while (1)
{
char key;
int count = (unsigned)rng % 100 + 3;//随机生成点的数量
cout << count << endl;
vector<Point> points;//点值
//随机生成点坐标
for (int i = 0; i < count; i++)
{
Point point;
point.x = rng.uniform(image.cols / 4, image.cols * 3 / 4);//uniform() 方法将随机生成下一个实数,它在[x,y]范围内。
point.y = rng.uniform(image.rows / 4, image.rows * 3 / 4);
if(i<10)
cout << "(" << point.x << "," << point.y << ")" << endl;
points.push_back(point);//C++ vector::push_back 会先创建临时对象,然后将临时对象拷贝到容器中
}
//检测凸包
vector<int> hull;
convexHull(Mat(points), hull, true);
//绘制出随机颜色的点
image = Scalar::all(0);
for (int i = 0; i < count; i++)
{
circle(image, points[i], 3, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), FILLED,LINE_AA);
}
//准备参数
int hullcount = (int)hull.size();//凸包边数
Point point0 = points[hull[hullcount - 1]];//连接凸包边的坐标点
// cout << hull[0] <<":"<< hull.size()<<endl;
//绘制凸包的边
for (int i = 0; i < hullcount; i++)
{
Point point = points[hull[i]];
line(image, point0, point, Scalar(255, 255, 255), 2, LINE_AA);
point0 = point;
}
imshow("凸包检测", image);
key = (char)waitKey();
if (key == 27 || key == 'q' || key == 'Q')
break;
}
return 0;
}
边栏推荐
猜你喜欢
【快应用】实现自定义导航栏组件
Consul简介和安装
FFmpeg extract H264 nalu from the mp4
组合模式
Product Description丨MobPush fast integration method on Android side
HarmonyOS自动化测试框架—Hypium
【HMS core】【FAQ】Analytics Kit、Push Kit典型问题合集3
【HMS core】【FAQ】AR Engine、Analytics Kit、Video Editor Kit、Image Kit、Map Kit典型问题合集2
AIRIOT答疑第8期|AIRIOT的金字塔服务体系是如何搞定客户的?
想玩转监控神器Prometheus吗?
随机推荐
Xilinx FPGA收发器参考时钟设计应用
设置iptables规则来保护CS服务器
set和map使用讲解
机器人控制器编程实践指导书旧版-实践八 机器人综合设计
Toronto Research Chemicals农药检测丨Naled-d6
Before opening a futures account, you must confirm the handling fee as soon as possible
Toronto Research Chemicals霉菌毒素分析丨T2 四醇
MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]
【快应用】如何使用命令打包快应用rpk
EasyGBS连接mysql数据库提示“can’t connect to mysql server”,如何解决?
FlexSim仿真软件入门笔记:基本操作、快捷键
搭载2.8K 120Hz OLED华硕好屏 无畏Pro15 2022锐龙版屏开得胜
LeetCode 198:打家劫舍
入门:人脸专集2 | 人脸关键点检测汇总(文末有相关文章链接)
网络层总结(未完待续)
Flexsim 发生器设置label和颜色
Keil5退出仿真调试卡死的解决办法
D-Wave成功上市!量子计算商业化正在加速
AIRIOT答疑第8期|AIRIOT的金字塔服务体系是如何搞定客户的?
Interface test advanced interface script using -apipost (pre/post execution script)