Opencv distrans demo学习及讲解

本文介绍了如何使用OpenCV中的distrans功能来绘制两点之间的中线,详细解释了distanceTransform函数的应用,包括输入图像、输出图像、标签、距离模式等参数,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前两天干活,用到了OpenCV中自带的distrans这个demo,我在这里简单的就我自己的使用经历讲解一下在使用distrans画两点中线问题中的使用。

这个demo可以在opencv249\opencv\sources\samples\cpp这个路径下面找到,你把他加入到你的工程里面去,就可以运行了,在工程中涉及的图片你也可以在刚才所讲的文件夹里面看到,在运行例子程序的时候,你也许会被它里面各种的模式以及乱七八糟的色彩搞蒙,不知道要干嘛。

CV_EXPORTS_AS(distanceTransformWithLabels) void distanceTransform( InputArray src, OutputArray dst,
                                     OutputArray labels, int distanceType, int maskSize,

                                     int labelType=DIST_LABEL_CCOMP );

整个程序中,最关键的就是这一步了,它包括输入图像,输出图像,输出图像的标签,距离模式,掩模尺寸等组成,其中的labels其实是尺寸大小和输入图像本身大小相同的图像,只是他依据到各个中心点的具体不同画中线,中线的结合点结束而形成的块状图。

如果想要将这所有的块状图一个个画出来,那么首先通过遍历所有的标签知道他有多少个,然后在一幅图像上依次展示所有的区域,对于每个区域利用连通域函数获得边界线段值,并将这些值都存入一个vector,然后将这个vector返回主函数,主要程序如下所示:

double minv = 0.0, maxv = 0.0;
double* minp = &minv;
double* maxp = &maxv;
minMaxIdx(labels, minp, maxp);
Vector<Vector<Vec2f>> map;
Vector<Vec2f> points;
cout << "Mat minv = " << minv << endl;
cout << "Mat maxv = " << maxv << endl;
for (int i = 0; i < 85; i++)
{
Mat labeltext = labels ==i+1;
imshow("label1 Map", labeltext);
//waitKey();
points=ConnectedComponents(labeltext,  1, 20, 0, Rect(), Point(-1, -1));
if (numCont > 0)
{
map.push_back(points);
}

}

 

 

学术交流可以关注我的公众号,后台留言,粉丝不多,看到必回。卑微小钱在线祈求

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与贰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值