前两天干活,用到了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);
}
}
学术交流可以关注我的公众号,后台留言,粉丝不多,看到必回。卑微小钱在线祈求