首页 文章

在OpenCV C中将车牌标准化为OCR

提问于
浏览
6

我正在做一些简单的OCR车牌识别系统 . 我正在使用HaarCascades找到车牌,然后我需要将这个盘子标准化,将其放入我的OCR模块中 . 我正在使用填充来找到车牌的主要轮廓,然后我执行霍夫变换,找到车牌的上下边界:

floodfill

Hough

这是代码的一部分,我执行Hough变换^

HoughLinesP(canny_img, lines, 1, CV_PI/180, 80, 80, 30 );

    for ( size_t i = 0; i < lines.size(); i++ ) {  
        line (output, Point(lines[i][0], lines[i][3]), Point(lines[i][4], lines[i][5]), Scalar(0,0,255), 1, 8 );
    }

现在我需要沿着这两条线切割和旋转这张照片 . 我怎样才能做到这一点?我明白我需要使用点Point(lines [i] [0]).. Point(行i),但是我应该用它们做什么?

所以基本上,我需要得到类似的东西:

  • Image,我使用了HaarCascades

enter image description here

  • 经过一些改造之后我需要得到这样的东西:
    enter image description here

所以在第一步我只需要削减上下边界 .

2 回答

  • 5

    你需要使用仿射变换,这里有tutorial . 在您的情况下,您需要选择一些尺寸的车牌,例如 20x100 . 您的目标点将是选择大小的非旋转矩形的3个角,源点将是已 Build 的汽车板的3个角 . 我希望很清楚,如果它不是,请让我知道 - 我会举一些例子 .

    *\EDIT:
    好的,我已经做了一些例子 . 这是代码:

    cv::Mat img = cv::imread("D:\\temp\\car_plate.jpg");
    cv::Point2f a1(25, 18), b1(279, 27), c1(279, 79), a2(0, 0), b2(img.size().width, 0), c2(img.size().width, img.size().height);
    //cv::Point2f a1(0, 16), b1(303, 28), c1(303, 81), a2(0, 0), b2(img.size().width, 0), c2(img.size().width, img.size().height);
    cv::Point2f src[] = {a1, b1, c1};
    cv::Point2f dst[] = {a2, b2, c2};
    cv::Mat warpMat = cv::getAffineTransform(src, dst);
    cv::warpAffine(img, img, warpMat, img.size());
    cv::imshow("result", img);
    cv::waitKey(-1);
    return 0;
    

    结果:

    enter image description here

    enter image description here

    如果您将使用代码而不进行任何修改,您将获得第一个结果,如果您注释第二行并取消注释第三行,您将获得第二个结果(我认为's what you wanted). To get the second result you just need to find the points where upper and lower lines cross the image border. I' ve在此处标记了它:

    enter image description here

    所以基本上你需要使用红点 . 要计算它们的位置,你只需要找到蓝线(如果我理解你已经有的话)穿过图像边框 .

  • 0

    这是EmguCv的解决方案:

    var src = new[] { new PointF(approxContour[0].X, approxContour[0].Y), new PointF(approxContour[1].X, approxContour[1].Y), new PointF(approxContour[2].X, approxContour[2].Y), new PointF(approxContour[3].X, approxContour[3].Y) };
    var dst = new[] { new PointF(0, 0), new PointF(0, 400), new PointF(400, 400), new PointF(400, 0) };
    
    var tmp = new UMat();
    var matrix = CvInvoke.GetPerspectiveTransform(src, dst);
    CvInvoke.WarpPerspective(imageRGB, tmp, matrix, new Size(400, 400));
    viewer.Image = tmp;
    

相关问题