簡體   English   中英

提高車牌識別率

[英]Improve car plate recognition

我正在研究基於車牌識別的學校項目。 我在簡單的電影上測試它:一輛車,靜態相機等。

這是它的樣子:

在此輸入圖像描述

我的第一步是在這個框架上只找到汽車(我認為它對於更“困難”的視頻會有所幫助): 在此輸入圖像描述

然后我搜索車牌。 這是我的代碼:

std::vector<cv::Rect> boundRect;
    cv::Mat img_gray, img_sobel, img_threshold, element;
    cvtColor(detectedMats[i], img_gray, CV_BGR2GRAY);
    cv::Sobel(img_gray, img_sobel, CV_8U, 1, 0, 3, 1, 0, cv::BORDER_DEFAULT);
    cv::threshold(img_sobel, img_threshold, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);
    element = getStructuringElement(cv::MORPH_RECT, cv::Size(30, 30));
    //element = getStructuringElement(cv::MORPH_RECT, cv::Size(17, 3) ); 
    cv::morphologyEx(img_threshold, img_threshold, CV_MOP_CLOSE, element);
    std::vector< std::vector< cv::Point> > LP_contours;
    cv::findContours(img_threshold, LP_contours, 0, 1);
    std::vector<std::vector<cv::Point> > contours_poly(LP_contours.size());
    for (int ii = 0; ii < LP_contours.size(); ii++)
        if (LP_contours[ii].size() > 100 && contourArea(LP_contours[ii]) > 3000 && contourArea(LP_contours[ii]) < 10000) //można się pobawić parametrami
        {
            cv::approxPolyDP(cv::Mat(LP_contours[ii]), contours_poly[ii], 3, true);
            cv::Rect appRect(boundingRect(cv::Mat(contours_poly[ii])));


            if (appRect.width > appRect.height)
                boundRect.push_back(appRect);
        } 

結果你可以看到第二張圖片。

然后嘗試獲得檢測板的良好輪廓。 我做了幾步。

  1. 鑒於亮度的急劇變化,通過直方圖均衡:

在此輸入圖像描述

  1. 使用過濾器和閾值:

      cv::Mat blur; cv::bilateralFilter(equalized, blur, 9, 75, 75); cv::imshow("Filter", blur); /* Threshold to binarize the image */ cv::Mat thres; cv::adaptiveThreshold(blur, thres, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 15, 2); //15, 2 cv::imshow("Threshold", thres); 

在此輸入圖像描述

在此輸入圖像描述

  1. 最后我找到了輪廓,但它們並不是那么好。 數字有點模糊:

      std::vector<std::vector<cv::Point> > contours; cv::findContours(thres, contours, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE); //cv::findContours(thres, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); double min_area = 50; double max_area = 2000; std::vector<std::vector<cv::Point> > good_contours; for (size_t i = 0; i < contours.size(); i++) { double area = cv::contourArea(contours[i]); if (area > min_area && area < max_area) good_contours.push_back(contours[i]); } 

    在此輸入圖像描述

也許你有一些想法如何改善結果? 我嘗試更改一些參數,但它仍然不能很好地工作。

感謝幫助

---------------------------編輯:tesseract安裝------------------- -----

  1. 我安裝了vcpkg。
  2. 使用

      .\\vcpkg install tesseract:x64-windows-static 

    在安裝結束時,我收到一些錯誤: 在此輸入圖像描述

  3. 但當我檢查它似乎很好: 在此輸入圖像描述

  4. 集成安裝后我得到了這個: 在此輸入圖像描述

  5. 將lib添加到項目中: 在此輸入圖像描述

所以看起來很好,但是當我嘗試運行示例時VS看不到庫:

在此輸入圖像描述

解決了:

更改

.\vcpkg install tesseract:x64-windows-static

.\vcpkg install tesseract:x64-windows

它很好用。

使用tesseract OCR檢測文本。 成功安裝tesseract后,在其他依賴項中添加tesseract305.lib和leptonica-1.74.4.lib。 使用以下代碼(來自教程):

#include "stdafx.h"
#include "winsock2.h"

#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>

#pragma comment(lib, "ws2_32.lib")

int main()
{
    char *outText;

    tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();

    // Initialize tesseract-ocr with English, without specifying tessdata path
    if (api->Init(NULL, "eng")) {
        fprintf(stderr, "Could not initialize tesseract.\n");
        exit(1);
    }

    // Open input image with leptonica library
    Pix *image = pixRead("test.tif");
    api->SetImage(image);
    // Get OCR result
    outText = api->GetUTF8Text();
    printf("OCR output:\n%s", outText);

    // Destroy used object and release memory
    api->End();
    delete[] outText;
    pixDestroy(&image);

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM