gpt4 book ai didi

android - 不同情况下文档四个角的检测

转载 作者:搜寻专家 更新时间:2023-11-01 08:25:05 24 4
gpt4 key购买 nike

我尝试了以下两种方法:-

  1. 图像到Mat的转换

  2. 应用高斯模糊

  3. 然后精明的边缘检测

  4. 寻找轮廓

这种方法的问题是:

  1. 检测到太多轮廓
  2. 主要是开放的轮廓
  3. 没有检测到我想检测的内容

然后我改变了我的方法并尝试在高斯模糊/中值模糊之后进行自适应阈值处理,结果好多了,我能够在 50% 的情况下检测到角点

我目前面临的问题是页面检测需要对比鲜明且没有任何反射的纯色背景。我认为它对于现实世界的使用来说过于理想化。

这是我需要帮助的地方。即使是解决方案的方向也受到高度赞赏,尤其是在 Java 中。感谢期待 在像这样的显着对比背景下工作得非常好

检测到4个角 enter image description here这张照片带来了麻烦,因为背景并不是最鲜明的对比 enter image description here

找到的初始最大轮廓

更新: 中值模糊并没有多大帮助,所以我追查了原因,发现页面边界是零散地检测到的,而不是单个轮廓,所以它检测到最大的轮廓作为页面边界因此执行了一些形态学操作以关闭相对较小的间隙,并且最终得到的最大轮廓肯定得到改善,但它不是最佳的。有什么想法可以改善巨大的差距吗? enter image description here

变形的原始图片

enter image description here

在变形图像中找到的最大轮廓

PS 在理想情况下对图像进行变形会导致检测到错误的轮廓边界。在变形图像之前可以检查的任何条件也是一个好处。谢谢

最佳答案

如果你使用这样的方法:

public static RotatedRect getBestRectByArea(List<RotatedRect> boundingRects) {
RotatedRect bestRect = null;

if (boundingRects.size() >= 1) {
RotatedRect boundingRect;
Point[] vertices = new Point[4];
Rect rect;
double maxArea;
int ixMaxArea = 0;

// find best rect by area
boundingRect = boundingRects.get(ixMaxArea);
boundingRect.points(vertices);
rect = Imgproc.boundingRect(new MatOfPoint(vertices));
maxArea = rect.area();

for (int ix = 1; ix < boundingRects.size(); ix++) {
boundingRect = boundingRects.get(ix);
boundingRect.points(vertices);
rect = Imgproc.boundingRect(new MatOfPoint(vertices));

if (rect.area() > maxArea) {
maxArea = rect.area();
ixMaxArea = ix;
}
}

bestRect = boundingRects.get(ixMaxArea);
}

return bestRect;
}

private static Bitmap findROI(Bitmap sourceBitmap) {
Bitmap roiBitmap = Bitmap.createBitmap(sourceBitmap.getWidth(), sourceBitmap.getHeight(), Bitmap.Config.ARGB_8888);

Mat sourceMat = new Mat(sourceBitmap.getWidth(), sourceBitmap.getHeight(), CV_8UC3);
Utils.bitmapToMat(sourceBitmap, sourceMat);

final Mat mat = new Mat();
sourceMat.copyTo(mat);

Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY);
Imgproc.threshold(mat, mat, 146, 250, Imgproc.THRESH_BINARY);

// find contours
List<MatOfPoint> contours = new ArrayList<>();
List<RotatedRect> boundingRects = new ArrayList<>();
Imgproc.findContours(mat, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

// find appropriate bounding rectangles
for (MatOfPoint contour : contours) {
MatOfPoint2f areaPoints = new MatOfPoint2f(contour.toArray());
RotatedRect boundingRect = Imgproc.minAreaRect(areaPoints);
boundingRects.add(boundingRect);
}

RotatedRect documentRect = getBestRectByArea(boundingRects);
if (documentRect != null) {
Point rect_points[] = new Point[4];
documentRect.points(rect_points);
for (int i = 0; i < 4; ++i) {
Imgproc.line(sourceMat, rect_points[i], rect_points[(i + 1) % 4], ROI_COLOR, ROI_WIDTH);
}
}
Utils.matToBitmap(sourceMat, roiBitmap);
return roiBitmap;
}

你可以为你的源图像实现这样的结果:

enter image description here

或者那个:

enter image description here

如果您调整阈值并应用过滤器,您可以获得更好的结果。

关于android - 不同情况下文档四个角的检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46190646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com