Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV Java文本分割_Java_C++_Opencv_Tesseract - Fatal编程技术网

OpenCV Java文本分割

OpenCV Java文本分割,java,c++,opencv,tesseract,Java,C++,Opencv,Tesseract,我正在使用OpenCV、Tesseract和Java开发车牌识别软件,但遇到问题,我似乎无法正确分割文本,并不是所有的字符都会被检测到,并用一个边界框进行绑定这些都是我的代码的一些输出…而且当我检测到字符时,我永远不知道哪个字符在哪个框中,所以当我将它们通过tesseract时,它们会变得混乱,我如何格式化我的字符串 尽管具有清晰可见的字符,但此操作仍失败: 此处,即使6清晰可见,也无法检测到Z和6: 下面是我的代码: originalFrame = image.clone(); r

我正在使用OpenCV、Tesseract和Java开发车牌识别软件,但遇到问题,我似乎无法正确分割文本,并不是所有的字符都会被检测到,并用一个边界框进行绑定这些都是我的代码的一些输出…而且当我检测到字符时,我永远不知道哪个字符在哪个框中,所以当我将它们通过tesseract时,它们会变得混乱,我如何格式化我的字符串

尽管具有清晰可见的字符,但此操作仍失败:

此处,即使6清晰可见,也无法检测到Z和6:

下面是我的代码:

originalFrame = image.clone();
    roiColor = image.clone();
    Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2GRAY, 0);
    originalFrameGrayScale = image.clone();
    Mat morph = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(9, 9));
    Imgproc.morphologyEx(image, image, Imgproc.MORPH_TOPHAT, morph);
    Imgproc.Sobel(image, image, -1, 2, 0);
    Imgproc.GaussianBlur(image, image, new Size(5,5), 3,3);
    Imgproc.morphologyEx(image, image, Imgproc.MORPH_CLOSE, morph);
    Imgproc.threshold(image, image, 200, 255, Imgproc.THRESH_OTSU);
    Vector<Rect> rectangles = detectionContour(image);
    Mat roi = originalFrameGrayScale.clone();
    if(!rectangles.isEmpty()){
    roi = originalFrameGrayScale.submat(rectangles.get(0));
    roiBlack = roi.clone();
    roiColor = roiColor.submat(rectangles.get(0));
    Imgproc.rectangle(originalFrame, rectangles.get(0).br(),    rectangles.get(0).tl(), new Scalar(0,0,255), 2);
   }

    Imgproc.medianBlur(roi, roi, 3); 
   Imgproc.adaptiveThreshold(roi, roi, 225, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 15, 3);
   roiBinarize = roi.clone();
   Mat erode = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1));
   Mat dilate = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(1, 1));
   Imgproc.morphologyEx(roi, roi, Imgproc.MORPH_OPEN, dilate);
   Imgproc.morphologyEx(roi, roi, Imgproc.MORPH_OPEN, erode);
   Imgproc.Canny(roi, roi, 150, 150 * 3, 3, true);
   Vector<Rect> letters = detectionPlateCharacterContour(roi);
   doTesseractOCR(letters, roiBinarize);

    private static void doTesseractOCR(Vector<Rect> letters, Mat plate){
    Tesseract instance = new Tesseract(); //
    instance.setLanguage(LANGUAGE);
    String resultPlate = "";
    for(int i= 0; i < letters.size(); i++){

     BufferedImage letter = OpenCvUtils.Mat2bufferedImage(plate.submat(letters.get(i)));
        try {
        String result = instance.doOCR(letter);
        resultPlate += result + " position "+i;

        } catch (TesseractException e) {
        System.err.println(e.getMessage());
        }
        System.out.println("Tesseract output: "+resultPlate);
    }
}



    private static Vector<Rect> detectionPlateCharacterContour(Mat roi) {
    Mat contHierarchy = new Mat();
    Mat imageMat = roi.clone();
    Rect rect = null;
    List<MatOfPoint> contours = new ArrayList<>();
    Imgproc.findContours(imageMat, contours, contHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE);
    Vector<Rect> rect_array = new Vector<>();

    for (int i = 0; i < contours.size(); i++) {
        rect = Imgproc.boundingRect(contours.get(i));
        double ratio = 0;

               if(rect.height > rect.width){
            ratio = rect.height/rect.width;

            }else{
                ratio = rect.width/rect.height;

            }
         Logger.printMessage("Ratio of letter: "+ratio);
      double contourarea = Imgproc.contourArea(contours.get(i));
         if (contourarea >= 100 && contourarea <= 1000 && ( ratio >= 1 && ratio <= 2)) {
         Imgproc.rectangle(roiColor, rect.br(), rect.tl(), new Scalar(255,0,0));
           rect_array.add(rect);
         }
    }


    contHierarchy.release();
    return rect_array;
}
originalFrame=image.clone();
roiColor=image.clone();
Imgproc.cvt颜色(图像,图像,Imgproc.COLOR\u bgr2灰色,0);
originalFrameGrayScale=image.clone();
Mat morp=Imgproc.getStructuringElement(Imgproc.morprect,新大小(9,9));
Imgproc.morphologyEx(图像,图像,Imgproc.MORPH\u TOPHAT,MORPH);
Sobel(图像,图像,-1,2,0);
图像,图像,新尺寸(5,5,3);
Imgproc.morphologyEx(图像,图像,Imgproc.MORPH\u CLOSE,MORPH);
Imgproc.threshold(图像,图像,200255,Imgproc.THRESH_OTSU);
矢量矩形=检测轮廓(图像);
Mat roi=原始框架grayscale.clone();
如果(!rectangles.isEmpty()){
roi=originalFrameGrayScale.submat(矩形.get(0));
roiBlack=roi.clone();
roiColor=roiColor.submat(矩形.get(0));
Imgproc.rectangle(原始帧,矩形.get(0).br(),矩形.get(0).tl(),新标量(0,0255),2);
}
Imgproc.medianBlur(roi,roi,3);
Imgproc.adaptiveThreshold(roi,roi,225,Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,Imgproc.THRESH_BINARY,15,3);
roiBinarize=roi.clone();
Mat侵蚀=Imgproc.getStructuringElement(Imgproc.morp_RECT,新大小(1,1));
Mat displate=Imgproc.getStructuringElement(Imgproc.morp\RECT,新大小(1,1));
Imgproc.morphologyEx(roi,roi,Imgproc.morp\u开放,扩张);
Imgproc.morphologyEx(roi,roi,Imgproc.morp_开放,侵蚀);
Imgproc.Canny(roi,roi,150150*3,3,真);
矢量字母=检测板字符轮廓(roi);
DoteSeractOCR(字母,二进制);
专用静态空白点seractocr(矢量字母、垫板){
Tesseract实例=新的Tesseract()//
实例.setLanguage(语言);
字符串resultPlate=“”;
对于(int i=0;i矩形宽度){
比率=垂直高度/垂直宽度;
}否则{
比率=矩形宽度/矩形高度;
}
Logger.printMessage(“字母比率:”+比率);
double contourarea=Imgproc.contourarea(contours.get(i));

如果(contourarea>=100&&contourarea=1&&ratio),请在文章中包含图像。单击文章中的链接,显示蓝色文本