gpt4 book ai didi

java - 如何使用 MatOfKeyPoint 绘制矩形以进行文本检测 | java

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:31 24 4
gpt4 key购买 nike

我正在使用 OpenCV4Android 进行实时文本检测和识别。识别部分全部完成。但是,我不得不问有关文本检测的问题。我正在使用 MSER FeatureDetector 检测文本。

这是实时和调用方法部分:

public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
carrierMat = inputFrame.gray();
carrierMat = General.MSER(carrierMat);
return carrierMat;
}

这是基本的 MSER 实现:

private static FeatureDetector fd = FeatureDetector.create(FeatureDetector.MSER);
private static MatOfKeyPoint mokp = new MatOfKeyPoint();
private static Mat edges = new Mat();

public static Mat MSER(Mat mat) {
//for mask
Imgproc.Canny(mat, edges, 400, 450);
fd.detect(mat, mokp, edges);
//for drawing keypoints
Features2d.drawKeypoints(mat, mokp, mat);
return mat;
}

它可以很好地查找带有边缘 mask 的文本。

我想像这样为簇绘制一个矩形:

enter image description here

或者这个:

enter image description here

你可以假设我的观点是正确的。

如您所见,fd.detect() 方法返回一个 MatOfKeyPoint。因此我尝试了这种绘制矩形的方法:

public static Mat MSER_(Mat mat) {
fd.detect(mat, mokp);
KeyPoint[] refKp = mokp.toArray();
Point[] refPts = new Point[refKp.length];

for (int i = 0; i < refKp.length; i++) {
refPts[i] = refKp[i].pt;
}
MatOfPoint2f refMatPt = new MatOfPoint2f(refPts);
MatOfPoint2f approxCurve = new MatOfPoint2f();

//Processing on mMOP2f1 which is in type MatOfPoint2f
double approxDistance = Imgproc.arcLength(refMatPt, true) * 0.02;
Imgproc.approxPolyDP(refMatPt, approxCurve, approxDistance, true);

//Convert back to MatOfPoint
MatOfPoint points = new MatOfPoint(approxCurve.toArray());
// Get bounding rect
Rect rect = Imgproc.boundingRect(points);
// draw enclosing rectangle (all same color, but you could use variable i to make them unique)
Imgproc.rectangle(mat, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), Detect_Color_, 5);
//Features2d.drawKeypoints(mat, mokp, mat);
return mat;
}

但是当我尝试 Imgproc.arcLength() 方法时,它突然停止了。我为 Imgproc.approxPolyDP() 方法提供了一个随机的 approxDistance 值,例如 0.1,它的工作效率并不高。

那么如何为检测到的文本绘制矩形呢?

最佳答案

我测试了您的代码并遇到了完全相同的问题。现在我仍然找不到问题所在。但是我找到了一个同时使用“MSER”和“形态学”的项目。你可以找到它here .

该项目结构非常简单,作者将“onCameraFrame”方法中的文本检测就像你一样。我实现了那个项目的方法并且有效,但结果还是不太好。

如果您正在寻找更好的文本检测工具,这里有两个。

  1. 笔划宽度变换 (SWT):一种全新的查找文本区域的方法。它快速高效。但是它仅适用于 c++ 或 python。你可以找到一些例子here .

  2. 使用类 ERFilter 的类特定极值区域:MSER 的高级版本。不幸的是,它仅在 OpenCV 3.0.0-dev 中可用。您不能在当前版本的 OpenCV4Android 中使用它。文件是here .

老实说,我是这方面的新手(2 个月),但我希望这些信息可以帮助您完成您的项目。

(更新:2015/9/13)我从 post 翻译了一个 c++ 方法.它比我提到的第一个 github 项目要好得多。这是代码:

public void apply(Mat src, Mat dst) {
if (dst != src) {
src.copyTo(dst);
}
Mat img_gray,img_sobel, img_threshold, element;

img_gray=new Mat();
Imgproc.cvtColor(src, img_gray, Imgproc.COLOR_RGB2GRAY);

img_sobel=new Mat();
Imgproc.Sobel(img_gray, img_sobel, CvType.CV_8U, 1, 0, 3, 1, 0,Core.BORDER_DEFAULT);

img_threshold=new Mat();
Imgproc.threshold(img_sobel, img_threshold, 0, 255, Imgproc.THRESH_OTSU+Imgproc.THRESH_BINARY);

element=new Mat();
element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(17, 3) );
Imgproc.morphologyEx(img_threshold, img_threshold, Imgproc.MORPH_CLOSE, element);
//Does the trick
List<MatOfPoint> contours=new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(img_threshold, contours, hierarchy, 0, 1);
List<MatOfPoint> contours_poly=new ArrayList<MatOfPoint>(contours.size());
contours_poly.addAll(contours);

MatOfPoint2f mMOP2f1,mMOP2f2;
mMOP2f1=new MatOfPoint2f();
mMOP2f2=new MatOfPoint2f();

for( int i = 0; i < contours.size(); i++ )

if (contours.get(i).toList().size()>100)
{
contours.get(i).convertTo(mMOP2f1, CvType.CV_32FC2);
Imgproc.approxPolyDP(mMOP2f1,mMOP2f2, 3, true );
mMOP2f2.convertTo(contours_poly.get(i), CvType.CV_32S);
Rect appRect=Imgproc.boundingRect(contours_poly.get(i));
if (appRect.width>appRect.height)
{
Imgproc.rectangle(dst, new Point(appRect.x,appRect.y) ,new Point(appRect.x+appRect.width,appRect.y+appRect.height), new Scalar(255,0,0));
}
}

}

关于java - 如何使用 MatOfKeyPoint 绘制矩形以进行文本检测 | java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32144128/

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