今天主要是研究另一个比较综合的例子。上一个例子只是简单地检测两个平行直线的线段长度和平行线之间的距离,主要应用了直线细化、霍夫变换等主要手段,那么这一次,我们来对三角形进行处理,对于初学者来说,这样一个三角形图片是经典的:
那么问题来了:
1. 求该三角形的周长
2. 求该三角形的面积
实际上这两个问题就是一个问题:三角形的位置信息?如果我们能得到三角形的三个顶点坐标,那么实际上我们就可以掌握这个三角形所有的信息。于是,我们将这个问题演化成这样一个问题:
求三角形三个顶点的坐标
我们不妨来整理一下思路:
1.该图像噪声比较明显,而且属于椒盐噪声,比较适合用中值滤波得到交清晰的图像;
2.进行边缘检测,对于相对来说比较复杂的图像,我们考虑用经典实用的canny算法进行边缘检测;
3.如果边缘存在厚度,我们要进行边缘细化,这张图边缘黑白分界明显,目测没有必要细化;
4.霍夫变换得到三条直线信息。想要得到线段范围信息,只能采用PPHT方法。
如果顺利的话,四步就能够得到我们想要的结果。那我们看看这样做的效果如何把:
Step1:滤波(在此之前转为灰度图像,此处略)
cvSmooth(gray, middle, CV_MEDIAN, 5, 5);
--------->
Step2:边缘检测
cvCanny(middle, canny, 80, 160);
可以看出,不需要边缘细化
Step3:霍夫变换
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* lines;
lines = cvHoughLines2(canny, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI / 180, 100, 100, 2000);
int n = 0;
for (int i = 0; i < lines->total; ++i)
{
CvPoint* point = (CvPoint*)cvGetSeqElem(lines, i);
cvCircle(result, point[0], 3,