我正在做一个将读取车牌的项目,我的计划是

  • 将图像转换为灰度以获得更好的性能
  • 使用直方图均衡器带出车牌字符
  • 模糊图像以去除一些噪点
  • 使用自适应阈值对图像进行二进制处理
  • 使用打开和关闭形态
  • 检测牌照的矩形边界框

  • 好吧,问题是:我的代码不是很好,结果很糟糕,我无法检测到矩形,下面是我的代码:
    Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2GRAY, 0);
        Imgproc.blur(image, image, new Size(3, 3));
        Imgproc.equalizeHist(image, image);
        Mat openElem = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1));
        Mat closeElem = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1));
        Imgproc.adaptiveThreshold(image, image, 225, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY_INV, 11, 2);
    

    输入图像:

    java - OpenCV车牌图像分割-LMLPHP

    输出图像:

    java - OpenCV车牌图像分割-LMLPHP

    如果有经验的人可以帮助我,我将不胜感激

    最佳答案

    首先,最好是检测图像中印版的位置,只需执行以下步骤:

  • 转换为灰色
    cvCvtColor(image,grayScale,CV_BGR2GRAY);

  • java - OpenCV车牌图像分割-LMLPHP
  • 做索贝尔
    Mat sobel =新Mat(grayScale.size(),CvType.CV_16S);
    cvSobel(grayScale,sobel,2,0,7);
    Mat temp =新Mat(sobel.size(),CvType.CV_8UC1);
    convertScaleAbs(sobel,temp,0.00390625,0);

  • java - OpenCV车牌图像分割-LMLPHP
  • 阈值
    cvThreshold(sobel,threshold,0,255,CV_THRESH_BINARY | CV_THRESH_OTSU); java - OpenCV车牌图像分割-LMLPHP
  • 做形态
    Mat kernal = cvCreateStructuringElementEx(3,1,1,0,CV_SHAPE_RECT);
    cvDilate(阈值,erode_dilate,内核,2); // X
    vErode(erode_dilate,erode_dilate,kernal,4); // X
    cvDilate(erode_dilate,erode_dilate,kernal,2); // X
    kernal = cvCreateStructuringElementEx(1,3,0,1,CV_SHAPE_RECT);
    cvErode(erode_dilate,erode_dilate,kernal,1); //是
    cvDilate(erode_dilate,erode_dilate,kernal,2);

  • java - OpenCV车牌图像分割-LMLPHP
  • 现在您可以检测图像中的矩形:

  • java - OpenCV车牌图像分割-LMLPHP
  • 然后您可以处理OCR的印版

  • 希望对您有帮助!

    07-24 09:52