大家好,
我一直在使用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;
}
它可以很好地找到带有边框蒙版的文本。
我想为这样的簇绘制一个矩形:
或者
你可以假设我有正确的观点。
如您所见,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()方法提供了一个随机的近似值,如0.1,它没有真正有效地工作。
那么如何为检测到的文本绘制矩形?
干杯!
答案 0 :(得分:4)
我测试了你的代码并且遇到了完全相同的问题。 现在我仍然无法找到问题所在。 但我找到了一个同时使用&#34; MSER&#34;和&#34;形态&#34;。 你可以找到它here。
该项目结构非常简单,作者提出了 &#34; onCameraFrame&#34;中的文本检测和你一样的方法。 我从该项目实现了该方法并且它工作正常, 但结果还不是很好。
如果您寻求更好的文本检测工具,请参阅其中两个。
笔画宽度变换(SWT): 一种寻找文本区域的全新方法。它快速有效。但它只能在c ++或python中使用。你可以找到一些例子here。
使用类ERFilter的类特定极值区域:MSER的高级版本。不幸的是,它仅在OpenCV 3.0.0-dev中可用。您无法在当前版本的OpenCV4Android中使用它。该文件为here。
说实话,我是这个领域的新手(2个月),但我希望这些信息可以帮助你完成你的项目。
(更新:2015年9月13日) 我从post翻译了一个c ++方法。 它比我提到的第一个github项目好得多。 这是代码:
$locationProvider.html5Mode(true); //it is not working in our situation.