我正在尝试开发一个使用Android Camera来检测“万事达卡,签证,客户卡等”卡的应用,为此,我使用了OpenCV4AndroID 3.0.0版.为了完成此任务,我做了以下工作:
1-使用以下方法将从相机拍摄的帧转换为灰度
imgproc.cvtcolor(this.mMatinputFrame, this.mMatGray, imgproc.color_BGR2GRAY);
2-使用模糊帧
imgproc.blur(this.mMatGray, this.mMatEdges, new Size(7, 7));
3-按如下方法使用Canny边缘检测器
imgproc.Canny(this.mMatEdges, this.mMatEdges, 2, 900, 7, true);
4-为了在真实图像上显示Canny的结果,我做了以下工作
this.mDest = new Mat(new Size(this.mMatinputFrame.wIDth(), this.mMatinputFrame.height()), CvType.CV_8U, Scalar.all(0));this.mMatinputFrame.copyTo(this.mDest, this.mMatEdges);
5-使用拨号图像
dilated = new Mat();Mat dilateElement = imgproc.getStructuringElement(imgproc.MORPH_DILATE, new Size(3, 3));imgproc.dilate(mMatEdges, dilated, dilateElement);
6-找到检测到的卡的轮廓,如下所示:
ArrayList<MatOfPoint> contours = new ArrayList<>(); hIErachy = new Mat();imgproc.findContours(dilated, contours, hIErachy, imgproc.RETR_CCOMP, imgproc.CHAIN_APPROX_SIMPLE);for (int i = 0; i < contours.size(); i++) { if (imgproc.contourArea(contours.get(i), true) > 90000) { Rect rect = imgproc.boundingRect(contours.get(i)); if (rect.height > 60) { imgproc.rectangle(mMatinputFrame, new Point(rect.x, rect.y), new Point(rect.x + rect.wIDth, rect.y + rect.height), new Scalar(255, 0, 0)); } }}
当我运行该应用程序时,
情况1
如果要检测的卡片是同色的“整个卡片都涂有相同的颜色”,则Canny会产生边界清晰的边缘,可以很容易地检测出该边缘,如图像“ same-color-0”和“ same-color- 1\” .
此外,当我将同色的卡片放在桌子上并在周围移动相机时,即使我在移动相机,也可以正确检测到边缘.或换句话说,红色框包围
记忆卡始终固定在边缘,永不消失
情况2
如果卡的颜色不是“混合色”的同色,则边缘检测很差,如图像“ mixed-color-0”和“ mixed-color-1”所示,并且包围的红色框卡的边缘经常消失.
从该情况扩展的另一种情况是,当卡为两种颜色时,一种是浅色而一种是深色,在这种情况下,边缘检测器仅检测到卡中的深色部分,因为它的边缘定义良好,如图中所示.
“混合色-2”
请让我知道如何获得清晰定义的卡片边缘和卡片大小(无论颜色如何)?
还有其他更准确的边缘检测方法吗?
同色-0:
同色-1
混色-0
混色-1
混色-2-
原始图片:
解决方法:
您可以使用Structured Edge Detection.
我在this my other answer中运行C代码获得了这些结果.对我来说,这似乎是一个不错的结果.
要在Java中使用它,您应该知道结构边缘检测在contrib模块ximgproc中.
您可能需要重新编译OpenCV才能使用它:Build OpenCV with contrib modules and Java wrapper
以上是内存溢出为你收集整理的android-如何获得轮廓分明的边缘而与颜色无关全部内容,希望文章能够帮你解决android-如何获得轮廓分明的边缘而与颜色无关所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)