2012-03-10 3 views
3

私は自分のプロジェクトにOCRを作成していますが、現時点では輪郭に基づいてセグメンテーションを実行していますが、画像はほとんどなくてもうまく機能しますが、画質誰かが私により正確な方法を提案してくれれば幸いです。誰かがコード例を提供していれば、ここに私の現在のコードがあります。OCR with javacv

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

「失敗する」とはどういう意味ですか?結果が間違っているか、マシンが激しくクラッシュする、またはその間に何かがありますか? –

+0

結果が正しくない..... –

+1

cvThreshold()の代わりにcvAdaptiveThreshold()を使ってみましたか? –

答えて

0

大津などのグローバルしきい値アルゴリズムを使用してください。しかし、JavaCVはこれを実装していません。したがって、ヒストグラム処理を使用して大津の閾値レベルを見つけて、その値を

に入力してください。
cvThreshold(s, dst, 100, 100, CV_THRESH_BINARY_INV);