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

如何使用MatOfKeyPoint绘制矩形以进行文本检测|爪哇,第1张

概述嗨,大家好,我一直在使用OpenCV4Android进行实时文本检测和识别.识别部分已完全完成.但是,我不得不问有关文本检测的问题.我正在使用MSERFeatureDetector来检测文本.这是实时的并调用方法部分:publicMatonCameraFrame(CameraBridgeViewBase.CvCameraViewFrameinputFrame){

嗨,大家好,

我一直在使用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,它的工作效率并不高.

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

干杯!

解决方法:

我测试了您的代码,并遇到了完全相同的问题.
目前,我仍然无法找到问题所在.
但是我发现一个同时使用“ MSER”和“ Morphologic”的项目.
您可以找到它here.

该项目的结构非常简单,作者将
像您一样,在“ onCameraFrame”方法中进行文本检测.
我实施了该项目中的方法,该方法成功了,
但是结果仍然不是很好.

如果您寻求更好的文本检测工具,这里有两个.

>笔划宽度变换(SWT):
一种查找文本区域的全新方法.快速高效.但是它仅在c或python中可用.您可以找到示例here.
>使用类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));            }        }   }
总结

以上是内存溢出为你收集整理的如何使用MatOfKeyPoint绘制矩形以进行文本检测|爪哇全部内容,希望文章能够帮你解决如何使用MatOfKeyPoint绘制矩形以进行文本检测|爪哇所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1089846.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存