gpt4 book ai didi

java - OpenCV Android(java)字符检测和字体识别

转载 作者:搜寻专家 更新时间:2023-11-01 09:34:17 31 4
gpt4 key购买 nike

我正在开发 Android 应用程序,它确定在文本图像上使用哪种字体。所以我需要从图像中提取每个字符,但不知道如何精确地提取。此外,当我尝试处理图像时,我得到了一个结果......但我的同学有不同的结果(例如,或多或少的噪音)。字符检测的问题在于:

1) 它还检测图像上的一些噪声 Blob 并将其显示在矩形中(我考虑过 detectMultiScale...但我对此表示怀疑,也许有最简单的方法来检测字符)

2) 它检测一个字符的多个轮廓(例如字母“o”的内外半径)

future 的问题:我将创建一个数据库,其中包含不同字体字母的图像(目前只有 3 种字体),并将它们与照片中的字母图像进行比较。也许有人可以推荐更好的方法。
所以这是图像处理代码的一部分(我还在研究模糊、阈值和 Canny 的值……但没有真正的积极结果):

Imgproc.cvtColor(sImage, grayImage, Imgproc.COLOR_BGR2GRAY); //градации серого
Imgproc.GaussianBlur(grayImage,blurImage,new Size(5, 5),0); //размытие
Imgproc.adaptiveThreshold(blurImage, thresImage, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 101, 39);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();

Imgproc.Canny(thresImage, binImage, 30, 10, 3, true); //контур
Imgproc.findContours(binImage, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0));

hierarchy.release();
Imgproc.drawContours(binImage, contours, -1, new Scalar(255, 255, 255));//, 2, 8, hierarchy, 0, new Point());


MatOfPoint2f approxCurve = new MatOfPoint2f();

//For each contour found
for (int i = 0; i < contours.size(); i++) {
//Convert contours(i) from MatOfPoint to MatOfPoint2f
MatOfPoint2f contour2f = new MatOfPoint2f(contours.get(i).toArray());
//Processing on mMOP2f1 which is in type MatOfPoint2f
double approxDistance = Imgproc.arcLength(contour2f, true) * 0.02;
Imgproc.approxPolyDP(contour2f, approxCurve, approxDistance, true);

//Convert back to MatOfPoint
MatOfPoint points = new MatOfPoint(approxCurve.toArray());


// Get bounding rect of contour
Rect rect = Imgproc.boundingRect(points);

// draw enclosing rectangle (all same color, but you could use variable i to make them unique)
Imgproc.rectangle(binImage, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(255, 255, 255), 5);

}

和屏幕(实际上不是来自代码的处理值,只是一个有更好结果的):

enter image description here

原文:

enter image description here

(不幸的是,我不能添加超过 2 个链接来显示更多示例)
在某些情况下,此屏幕上的图片看起来不错,但另一张图片看起来有不规则的 Blob 。

最佳答案

您的代码很好,您只需要稍作调整即可使其正常工作。

  • 首先,图像尺寸非常大,您可以安全地将其缩小到当前尺寸的 20%,而不会严重影响精度。由于图像尺寸较大,所有功能的执行速度都会变慢。

  • 在 Canny 之前不需要执行自适应阈值,canny 在灰度图像上也能完美工作,您需要将参数调整为:

    Canny(img, threshold1=170, threshold2=250)

    生成的图像为:enter image description here

  • [可选] 如果您想对图像进行降噪,那么您可以尝试使用形态学操作,例如erodedilate

    <
  • 现在您已准备好寻找轮廓。您的代码中的错误是使用 Imgproc.RETR_TREE 标志,您需要使用 Imgproc.RETR_EXTERNAL 标志来获取外部轮廓而不是嵌套的内部轮廓。

    在这一步你可能会有一些不需要的小轮廓,可以过滤为:

    // ** Below code if for reference purposes only, consult OpenCV docs for proper API methods
    int character_area_lower_thresh = 10;
    for (Contour c:contours) {
    if (Imgproc.contourArea(c) > character_area_lower_thresh) {
    // Desired contour, do what ever you want to do
    Rect r = Imgproc.boundingRect(c);
    }
    }

    enter image description here

关于java - OpenCV Android(java)字符检测和字体识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44692713/

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