我正在使用OpenCV4Android进行实时文本检测和识别。目前,识别部分已经完全完成。但是,我需要询问一些关于文本检测的问题。我正在使用MSER FeatureDetector来检测文本。
以下是实时调用方法的部分内容:
但是当我尝试使用Imgproc.arcLength()方法时,它突然停止了。 我为Imgproc.approxPolyDP()方法提供了一个随机的approxDistanc值,如0.1,但它并没有真正有效地工作。
那么,我该如何为检测到的文本绘制矩形?
以下是实时调用方法的部分内容:
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()方法提供了一个随机的approxDistanc值,如0.1,但它并没有真正有效地工作。
那么,我该如何为检测到的文本绘制矩形?