使用JavaCV进行OCR

3

我正在为我的项目制作OCR,但在一个点上卡住了。目前,我正在基于轮廓执行分割,对于一些图片它能正常工作,但对于一些质量良好的图片却失败了。如果有人能提供更准确的方式,或者提供代码示例,我将不胜感激。下面是我的当前代码。

public static void imageBinarization(IplImage src, IplImage dst){
    IplImage r, g, b, s;
        r = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
        g = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
        b = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);

        cvSplit(src, r, g, b, null);

        s = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);

        cvAddWeighted(r, 1./3., g, 1./3., 0.0, s);
        cvAddWeighted(s, 2./3., b, 1./3., 0.0, s);
        cvThreshold(s, dst, 100, 100, CV_THRESH_BINARY_INV);
        cvReleaseImage(r);
        cvReleaseImage(g);
        cvReleaseImage(b);
        cvReleaseImage(s);
}
public static void imageSegmentation(String sourcePath, String targetPath){
    cvConvert(t0, mat0);
    cvConvert(t8, mat8);
    cvConvert(t9, mat9);

    IplImage image = cvLoadImage(sourcePath);
    IplImage grayImage = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);

    //cvSmooth(image, image, CV_BLUR_NO_SCALE, 2);

    //cvSmooth(image, image, CV_BLUR, 9, 9, 2, 2);

    //cvSmooth(image, image, CV_GAUSSIAN, 3);

    imageBinarization(image, grayImage);



    CvMemStorage mem;
    CvSeq contours = new CvSeq();
    CvSeq ptr = new CvSeq();
    mem = cvCreateMemStorage(0);
    CvRect rect = null;
    int px1,px2, py1, py2;

    CvScalar blue = CV_RGB(0, 0, 250);
    int n = 0; int i = 0;
    cvFindContours(grayImage, mem, contours, sizeof(CvContour.class) , CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

    Random rand = new Random();
    for (ptr = contours; ptr != null; ptr = ptr.h_next()) {

        Color randomColor = new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
        CvScalar color = CV_RGB( randomColor.getRed(), randomColor.getGreen(), randomColor.getBlue());

        rect =  cvBoundingRect(ptr, n);//new CvRect(cvGetSeqElem(c, c.total()));
        px1 = rect.x(); py1 = rect.y(); px2 = (rect.x() + rect.width()); py2 = (rect.y() + rect.height());
        cvRectangle(image, cvPoint(px1, py1), cvPoint(px2, py2), blue, 1, CV_AA, 0);

        //----
        xbox = rect.x(); ybox = rect.y(); wbox = rect.width(); hbox = rect.height();
        img = cvCreateImage(cvSize(wbox, hbox), image.depth(), image.nChannels());
        cvSetImageROI(image, cvRect(xbox, ybox, wbox, hbox));
        cvCopy(image, img);
        cvResetImageROI(image);

        //cvSaveImage(targetPath+i+".jpg", img);
        i++;
        //---
        //cvDrawContours(image, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));
    }
    cvSaveImage(targetPath+"mat.jpg", image);
}

1
“它失败”是什么意思?结果不正确,还是你的机器崩溃了,或者介于两者之间? - Samuel Audet
结果不正确。 - Ali Baksh
1
你尝试过使用cvAdaptiveThreshold()代替cvThreshold()吗? - Samuel Audet
还没有,但我会尝试这个... - Ali Baksh
http://en.wikipedia.org/wiki/Optical_character_recognition#Pre-processing - Can Ürek
显示剩余2条评论
1个回答

0

尝试使用一些全局阈值算法,比如大津算法。但是JavaCV尚未实现该算法。因此,尝试使用直方图处理查找Otsu阈值水平,并将该值应用于

cvThreshold(s, dst, 100, 100, CV_THRESH_BINARY_INV);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接