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 のようなランダムな approxDistance 値を指定しましたが、実際には効率的に動作しません。
では、検出されたテキストに四角形を描画するにはどうすればよいですか?