gpt4 book ai didi

c++ - 在 OpenCV C++ 中为 OCR 规范化车牌

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:20 26 4
gpt4 key购买 nike

我正在做一些简单的 OCR 车牌识别系统。我正在使用 HaarCascades 查找车牌,接下来我需要标准化此车牌,以将其放入我的 OCR 模块中。我正在使用 floodfill 找到车牌的主要轮廓,然后我执行 Hough 变换,找到车牌的上边界和下边界:

floodfill

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(lines i ),但我应该用它们做什么?

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

  1. 图片,我使用 HaarCascades 得到的

enter image description here

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

所以在第一步我只需要切割上边界和下边界。

最佳答案

需要用到仿射变换,这里有tutorial .在您的情况下,您需要选择一些尺寸的车牌,例如 20x100。您的目标点将是所选尺寸的非旋转矩形的 3 个角,源点将是已创建车牌的 3 个角。我希望它很清楚,如果不是,请告诉我 - 我会举一些例子。

*\\编辑:
好的,我已经举了一些例子。这是代码:

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
如果您将使用代码而不进行任何修改,您将获得第一个结果,如果您注释第二行并取消注释第三行,您将获得第二个结果(我认为这就是您想要的)。要获得第二个结果,您只需要找到上下线穿过图像边界的点。我在这里做了标记:
enter image description here
所以基本上你需要使用红点。要计算它们的位置,您只需要找到蓝线(如果我理解正确的话您已经有了)穿过图像边界的位置。

关于c++ - 在 OpenCV C++ 中为 OCR 规范化车牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28357884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com