openCV学习之iOS使用二

2017-01-20  本文已影响289人  AppleTTT

一、本篇由来

在上一篇openCV学习之iOS使用一种我采用网上提供的一种思路,可以检测到图形中的四边形,但是我测试了,效果并不好,如下:
1.图片复杂的时候(实际上是大部分情况下)是检测不到图片中的四条线的,所有会出现用边缘线补线的情况,这样会导致不准;
2.检测图片边缘线的算法很粗糙,仅仅是比较霍夫函数处理后的线段的中点,这样不合理也不准确;
3.图片中各种canny,hough函数的参数需要根据图片的复杂程度来定,这样很难给到一个值去鉴定用户可能拍到的各种图片;

二、方案二

鉴于以上三种问题会很影响用户体验,因此决定暂时不用这种办法处理,采用了MMCamScanner提供的思路来处理图片,从而抓取到图片中的四边形文档区域的需求。

1.根据imageView的image的scale来resize image的大小,并将image转为Mat;
2.图片GaussianBlur->mixChannels->canny->dilate->findContours->approxPolyDP->判断边和面积以及是否为凸多边形->push_back这些点

高斯模糊GaussianBlur:可以有助于图片的边缘检测;<br />
mixChannels:从输入中拷贝某通道到输出中特定的通道;<br />
Canny:检测边缘;<br />
dilate:膨胀处理除去图片上的一些杂质;<br />
findContours: 找到图片中所有的多边形;<br />
approxPolyDP: 对图像轮廓点进行多边形拟合;<br />
通过std::vector<cv::Point> approx的size()函数判断是几边形;<br />
通过contourArea筛选面积太小的多边形;<br />
通过isContourConvex来判断是否为凸边形;<br />
循环2的操作,达到操作不同下限的四边形;

3.通过contourArea找出最大的四边形的四个点;
4.给四个点排序,找出topLeft,topRight,bottomRight和bottomLeft四个点;
5.根据四个点的位置找到图片位置,然后进行透射变换得到矩形图片;(透射变换的时候要记得将之前resize的scale考虑进去);

有了上述的思路有,基本上可以写个大概出来了,如果还有什么不懂的,可以问我哦!
建议小伙伴们可以结合两种思路一起写,先用思路二去找到,如果找到的矩形跟照片一样大的话,那就在用思路一去找四边形,这样会稍微提高一些准确率。

上一篇下一篇

猜你喜欢

热点阅读