- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
需要堆栈溢出的强大帮助。实际上,我开发的应用程序必须通过 OCR(我正在使用 tesseract)文档进行分析,并提取我可以从中提取的所有文本。这是图像类型的示例:
Image including text to extract
这是我在预处理中所做的,以去除所有的线条。将来我可能还必须分别分析每个“矩形”(将由给定线定义的区域提供给 tesseract)所以我想有比这更简单的方法,但我不会有“线”坐标。
package formRecog;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import static org.opencv.core.Core.bitwise_not;
import org.opencv.core.MatOfPoint;
public class testMat {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat source = Imgcodecs.imread("./image.png",Imgcodecs.CV_LOAD_IMAGE_ANYCOLOR);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
Imgproc.cvtColor(source, destination, Imgproc.COLOR_RGB2GRAY);
Imgcodecs.imwrite("gray.jpg", destination);
Imgproc.GaussianBlur(destination, destination, new Size(3, 3), 0, 0, Core.BORDER_DEFAULT);
Imgproc.Canny(destination, destination, 30, 90);
Imgcodecs.imwrite("postcanny.jpg", destination);
Mat houghlines = new Mat();
Imgproc.HoughLinesP(destination, houghlines, 1, Math.PI / 180, 250, 185,5);
//DESSINER LES LIGNES
Mat result = new Mat(source.rows(), source.cols(), source.type());
for (int i = 0; i < houghlines.rows(); i++) {
double[] val = houghlines.get(i, 0);
Imgproc.line(destination, new Point(val[0], val[1]), new Point(val[2], val[3]), new Scalar(0, 0, 255), 5);
Imgproc.line(result, new Point(val[0], val[1]), new Point(val[2], val[3]), new Scalar(0, 0, 255),5);
}
Imgcodecs.imwrite("lines.jpg", result);
Mat contourImg = new Mat(source.rows(), source.cols(), source.type());
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
//Point offset = new Point();
Imgproc.findContours(destination, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_NONE );
Imgproc.drawContours(contourImg, contours, -1, new Scalar(255, 0, 0),-1);
Imgcodecs.imwrite("contour.jpg", contourImg);
bitwise_not(destination,destination);
Imgcodecs.imwrite("final.jpg", destination);
}
}
这是最终的图像
问题是,tesseract 没有读到任何关于这个的内容:
11m ÈEZÈ@ÜDS@7C@mpû@ 515 îf@5@??ûäû©©m@@@ @@ vësw??a?PF©@MÜGS @"@X@Ü©ÜÊQÜ©IÏÙ 1111175515
是我得到的第一条“线”。
我认为这是因为字母不再“填充”并且 tesseract 无法读取它们,因为 tesseract 实际上先给了我很好的结果,但是删除行的方法并不好。我想用黑色填充字母但是
Imgproc.drawContours(contourImg, contours, -1, new Scalar(255, 0, 0),-1);
不做任何事情,虽然我很确定 findContours 工作正常,因为如果我输入它的结果,我会得到与以前完全相同的图像。
我搜索了类似的问题 cv2.drawContours will not draw filled contour和 Contour shows dots rather than a curve when retrieving it from the list, but shows the curve otherwise但没有找到任何我可以使用的东西(也许没有得到它)。
就像你知道的那样,我在 9 月份开始了编程类(class),所以我对这件事很陌生(如果这里写了一些令人毛骨悚然的东西请原谅我),但我在这个主题上别无选择致力于:)
我希望我说得足够清楚并且我的英语不是太差。
非常感谢。
编辑:感谢 Rick.M 它变得越来越好,在 findcontours 中使用 CHAIN_APPROX_SIMPLE 并在 drawcontours 中通过 ldx 迭代达到了目的。 New final
有没有办法改善这个结果?我猜 tesseract 也不会吃这个?谢谢
正在上传 postcanny 图片:Image after canny
最佳答案
drawContours
没有按要求工作的原因是标志:CHAIN_APPROX_NONE
绝对存储所有轮廓点。因此,使用 CHAIN_APPROX_SIMPLE
压缩水平、垂直和对角线段并仅保留它们的端点 为您提供完成的轮廓。在这种情况下,您还可以使用 Imgproc.drawContours(contourImg, contours, -1, new Scalar(255, 0, 0),-1);
没有循环,应该可以正常工作。
现在,对于评论中的讨论,Canny 图像看起来不错,但正如您在缩放后看到的那样,findContours
未检测到的字母未完全连接。我建议使用 erosion使用小内核(您必须使用参数)以获得更好的结果。
关于java - drawContours 不填充/JAVA - OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50406682/
padding:initial 比 padding:0 有什么优势吗?示例: textarea { padding: 0; } Hello, world! 最佳答案 它们的意思是一
我尝试通过按钮填充 JList,然后在先前填充的 Jlist 上使用 DoubleClick 填充 JTextField。 代码: private void extractUsedVariables
我正在尝试做 var width = ($(this).width() + $(this).css('padding-left') + $(this).css('padding-right' ));
我在导航中添加了悬停效果,遗憾的是悬停也影响了上面的文字。如何在不影响文本位置的情况下向导航添加悬停? 可悲的是,我找不到解决这个问题的方法。 HTML 模板:http://projects.help
我是 F# 初学者,下面代码中的 %-5s 和 %5s 有什么作用?我认为它提供了空间填充,但我不确定它是如何填充的? printfn "%-5s %5s" "a" "b" 当我尝试 prin
我需要选择带狗的用户(带 type 等于“狗”的宠物) var User = Waterline.Collection.extend({ identity: 'user', attribute
我一直在尝试让 Excel 在一组列上应用公式,然后将模式扩展到整个行集。 这导致了以下代码: For i = 0 To avgsheetNames.Count - 1 If Contains(CSt
随着 Flutter 2.0 的发布,FlatButton已被替换为 TextButton . 因此,填充属性不再直接可用,而是作为 ButtonStyle属性(property)。 我的问题是,我该
这似乎是一个简单的问题,但我已经尝试了一个小时,似乎无法弄清楚。 我要做的就是用 Canvas 填充 MainWindow。我找不到任何允许这样做的属性,我能想到的唯一方法是设置 Canvas.Wid
这是a website具有移动 View 。 网站宽度为 640 像素,但 iPhone 以 678 像素渲染文档。在 Android 中看起来很棒。 我添加了视口(viewport)元: 主体 C
我正在使用 GridBagLayout到(当前)显示两行。我知道这种布局对于这项任务来说太过分了,但我正在努力学习如何使用它。问题是我已将两个面板添加到两个单独的行中,并且内容周围存在巨大差距(请参见
我有以下代码已传递给我并创建多边形: var map; function initialize() { var myLatlng = new google.maps.LatLng(-36.4
我在 Jpanel 中有一些项目,然后将其推到顶部并用作基本搜索引擎的工具栏。我遇到一个问题,因为没有足够的空间,所以我的最后一个组合框没有显示。但是,左侧有很多空白空间,我需要移动所有内容来填充 J
我创建了带有阈值的二进制图像。如下图所示如何改变白色形状的颜色以使其可索引? 到目前为止,这是我的代码: void threshold() { cv::Mat src_8uc3_img = c
我有一个 JTable,我想知道是否有更好的方法来填充它,这是我的代码: //Metodo para llenar un jtable con datos de la base public stat
我想要做的是裁剪一个卷以删除所有不相关的数据。例如,假设我有一个 100x100x100 的体积,其中填充了 0,但其中的 50x50x50 体积则填充了 1。如何从原始体积中获得裁剪后的 50x50
因此,我正在创建一种对一组数字进行洗牌的方法,其想法是创建这些数字的总体。因此,我创建了一个循环,对数字进行洗牌,然后将其添加到数组列表中,但是经过一些调试语句后,我发现它确实对数字进行洗牌,但只将最
假设我有这两个类: public class A where T : IEntityWithID, new() { private static EntityInfo entityInfo =
我正在尝试添加用户输入的两个大整数作为字符串。当两个输入字符串的长度不同时,我尝试用零填充较短的数字,但它不起作用。因此,如果我输入 456 和 7,它会给出 3,前面有一些随机字符。感谢您的任何建议
这是我将内容打印到表格 View 的代码 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: Index
我是一名优秀的程序员,十分优秀!