【问题标题】:OpenCV Java - How to get a region of interest from a document image?OpenCV Java - 如何从文档图像中获取感兴趣的区域?
【发布时间】:2021-10-11 13:37:38
【问题描述】:

我正在尝试从文档图像中获取感兴趣的区域。感兴趣的区域是文档负责人的签名。我在 android 上使用 opencv 来尝试标记签名区域,但我无法确定要使用哪些参数,以便算法理解它在第一个签名附近。

我想像这样获得感兴趣的区域:

我的代码:

@Override
    public void onClick(View v) {
        
        AsyncTask.execute(() -> {
            bmScaled.recycle();
            Matrix matrix = new Matrix();
            matrix.postRotate(angleFinal);
            original = Bitmap.createBitmap(original, 0, 0, original.getWidth(), original.getHeight(), matrix, true);

            Mat sourceMat = new Mat(original.getWidth(), original.getHeight(), CvType.CV_8UC3);
            List<MatOfPoint> contourList = new ArrayList<>(); //A list to store all the contours
            Mat imgFinal = new Mat();
            Mat hsvMat = new Mat();
            Mat opening = new Mat();
            Mat close = new Mat();
            Mat hierarchy = new Mat();
            Mat roiTmp = sourceMat.clone();

            Utils.bitmapToMat(original, imgFinal);
            Imgproc.cvtColor(imgFinal, hsvMat, Imgproc.COLOR_BGR2HSV);
            Scalar lowerb= new Scalar(85, 50, 40);
            Scalar upperb= new Scalar(135, 255, 255);
            Core.inRange(hsvMat, lowerb, upperb, roiTmp);
            Mat mask = new Mat();
            Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
            Imgproc.morphologyEx(mask, opening, Imgproc.MORPH_OPEN, kernel);
            Imgproc.morphologyEx(opening, close, Imgproc.MORPH_CLOSE, kernel);

            //finding contours
            Imgproc.findContours(close, contourList, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

            //Drawing contours on a new image
            Mat contours = new Mat();
            contours.create(hierarchy.rows(), hierarchy.cols(), CvType.CV_8UC3);
            Random r = new Random();
            for (int i = 0; i < contourList.size(); i++) {
                Imgproc.drawContours(contours, contourList, i, new Scalar(r.nextInt(255), r.nextInt(255), r.nextInt(255)), -1);
            }

            Imgcodecs.imwrite(IMAGE_PATH+"/TESTE.jpg", contours);

        });
    }

【问题讨论】:

    标签: java android opencv kotlin image-processing


    【解决方案1】:

    由于签名本身的边界很难确定,您可以尝试在文档上找到其他“稳定标记”并确定相对于它们的 ROI(签名区域)。例如,您可以选择“标记”表单元素1234(红色矩形)在文档上找到它们,并通过计算它们之间的标准化距离来大致确定签名位置。假设,如果图像的标准化宽度和高度为 100 个单位,则签名区域应约为 75 个“水平单位”和 20 个“垂直单位”,其左上角应约为 (10, 70) 位置(从左上角算起)表格的角落):

    还需要几个锚点来“规范化”文档扫描的 with 和 height 并移除图片旋转(如果存在)。

    【讨论】:

    • 很好,解决问题的思路更加清晰。你知道任何可以指导我做你推荐的材料或代码吗?
    • @TecnologiadaNet 您应该搜索“OpenCV 模板匹配”材料,例如Official Descriptionthisthat 等示例。
    猜你喜欢
    • 2018-01-15
    • 2018-06-17
    • 2013-03-03
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2017-09-28
    • 2012-04-25
    • 2016-04-25
    相关资源
    最近更新 更多