最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?OpenCV技術(shù)實戰(zhàn)之身份證離線識別

 更新時間:2021年12月29日 14:34:11   作者:Tim  
OpenCV身份證離線識別技術(shù)的主要技術(shù)就是通過OpenCV找到身份證號碼區(qū)域,然后通過OCR進行數(shù)字識別該區(qū)域的截圖即可得到身份證號碼。感興趣的可以了解一下

OpenCV身份證離線識別技術(shù)的主要技術(shù)就是通過OpenCV找到身份證號碼區(qū)域,然后通過OCR進行數(shù)字識別該區(qū)域的截圖即可得到身份證號碼。本地ORC使用tess-two來完成,Tesseract是C++實現(xiàn)的OCR引擎,在Android中使用不是很方便,需要封裝JavaAPI才能在Android平臺中進行調(diào)用,然而tess-two已經(jīng)幫我們做好了這些事情,通過集成tess-two就可以很方便的完成文字識別。

總體思路

圖像的預(yù)處理

1、無損壓縮

首先要處理的問題就是圖片的大小不一樣,因為每臺設(shè)備的的像素或者說每個圖片的大小本身都不一樣,處理過程也會有所差異,所以首先解決的問題就是大小統(tǒng)一,先通過無損壓縮把圖片處理為大小一致的圖像。根據(jù)經(jīng)驗值(或者說這是處理證件類的通用手法),先把圖像處理為640×400的大小。

2、灰度化

現(xiàn)在大部分的彩色圖像都是采用RGB顏色模式,處理圖像的時候,要分別對RGB三種分量進行處理,實際上RGB并不能反映圖像的形態(tài)特征,只是從光學的原理上進行顏色的調(diào)配。圖像灰度化處理可以作為圖像處理的預(yù)處理步驟,為之后的圖像分割、圖像識別和圖像分析等上層操作做準備。

其實可以仔細想想,如果是處理一張RGB圖像的話,一個像素點需要同時處理3個值,灰度化之后只需要處理一個值。如果是對比的話,一個RGB像素點就有256×256×256種可能,但是如果是對比灰度圖的像素點,則只有256種可能,65536倍的速度提升,所以很多時候做其他圖像處理之前,先轉(zhuǎn)化為灰度圖。

圖像灰度化處理有分量法、最大值法、平均值法、加權(quán)平均法,其中用得較多的是加權(quán)平均法。由于人眼對綠色的敏感最高,對藍色敏感最低,因此,按下式對RGB三分量進行加權(quán)平均能得到較合理的灰度圖像:

3、圖像二值化

通過以上對彩色圖片進行灰度化以后,把獲取到的灰度圖像進行二值化處理。對于二值化,其目的是將目標用戶背景分類,為后續(xù)車道的識別做準備?;叶葓D像二值化最常用的方法是閾值法,他利用圖像中目標與背景的差異,把圖像分別設(shè)置為兩個不同的級別,選取一個合適的閾值,以確定某像素是目標還是背景,從而獲得二值化的圖像。比如以100為閾值對圖像進行二值化操作:

f(i, j) = \left{\begin{array}{cc} 0, & (\text { gray }< = 100) \ 255, & (\text { gray }>100) \end{array}\right.

4、膨脹與腐蝕

膨脹與腐蝕屬于圖像處理中最基本的形態(tài)學運算,形態(tài)學操作就是基于形狀的一系列圖像處理操作。OpenCV為進行圖像的形態(tài)學變換提供了快捷且方便的函數(shù)。主要用于噪聲消除、分割出獨立的圖像元素、在圖像中連接相鄰的元素、尋找圖像中的明顯的極大值區(qū)域或極小值區(qū)域、求出圖像的梯度。

簡單理解,膨脹就是求局部最大值的操作。腐蝕就是求局部最小值的操作。在處理身份證的時候,我們希望把身份證號碼等數(shù)字區(qū)域連接在一起,即在圖像中連接相鄰的元素,所以需要使用膨脹處理,就跟蒸饅頭的酵母粉一樣,可以是我們想要的元素膨脹并且黏合在一起。

5、輪廓檢測與圖像分割

通過圖像的膨脹操作,身份證號碼區(qū)域已經(jīng)被連接在一起了,目前需要做的事情就是檢測出該區(qū)域的輪廓,使用拉普拉斯算子可以完成這個操作,OpenCV內(nèi)部也提供了findContours函數(shù)做輪廓檢測。

那么如何分割出身份證號碼區(qū)域呢?其實有一個非常簡單的思路,由于身份證號碼是一串不換行的數(shù)字,寬高比通常是大于9:1的,而且是位于最后一行的,如果有其他的部分的寬高比大于9:1但是卻不是位于最后,那么也不能認為是身份證號碼,只有坐標是最底部,而且寬高比滿足大于9:1的條件才可以。

主要代碼

VS2022 + OpenCV4.5.4

#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>

#define DEFAULT_CARD_WIDTH 640
#define DEFAULT_CARD_HEIGHT 400

#define FIX_IDCARD_SIZE Size(DEFAULT_CARD_WIDTH, DEFAULT_CARD_HEIGHT)

#define FIX_TEMPLATE_SIZE Size(153, 28)

using namespace std;
using namespace cv;

int main() {
    std::cout << "Hello, World!" << std::endl;
    Mat src = imread("src.png");
    imshow("src", src);

    //處理身份證
    Mat src_img = src;
    //1、無損壓縮 640*400 (通用卡片類的處理方式)
    resize(src_img, src_img, FIX_IDCARD_SIZE);
    imshow("dst", src_img);
    
    Mat dst_img;
    //2、灰度化
    Mat dst;
    cvtColor(src_img, dst, COLOR_BGR2GRAY);
    imshow("gray", dst);
    
    //3、二值化(降噪)
    threshold(dst, dst, 100, 255, THRESH_BINARY);
    imshow("threshold", dst);
    
    // 4.1 腐蝕、膨脹
    Mat erodeElement = getStructuringElement(MORPH_RECT, Size(20, 10));
    erode(dst, dst, erodeElement);
    imshow("erode", dst);

    //4、輪廓檢測,把所有的連續(xù)的閉包用矩形包起來
    /*
     * 一個矩形用兩個點表示,contours就包含了很多矩形
     */
    vector<vector<Point>> contours;
    vector<Rect> rects;
    
    findContours(dst, contours, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
    
    for (size_t i = 0; i < contours.size(); i++)
    {
        // 基于兩點構(gòu)建矩形
        Rect rect = boundingRect(contours.at(i));
        // 繪制矩形
        rectangle(dst, rect, Scalar(0, 0, 255));
        imshow("contours", dst);
        // 對符合條件的圖片進行篩選,寬高比大于1:9的
        if(rect.width > rect.height*9)
        {
            cout << "找到了" << endl;
            rects.push_back(rect);
            rectangle(dst, rect, Scalar(0, 0, 255));
    
            // 還需要再次矯正
            //dst_img = src_img(rect);
        }
    }
    
    // imshow("dst_Img", dst_img);
    
    // 如果只找到了一個矩形,說明這個就是,如果多個就找出縱坐標最低的矩形
    if(rects.size() == 1)
    {
        Rect rect = rects.at(0);
        dst_img = src_img(rect);
    }else
    {
        int lowPoint = 0;
        Rect finalRect;
    
        for (size_t i = 0; i < rects.size(); ++i)
        {
            Rect rect = rects.at(i);
            Point p = rect.tl();
            if(rect.tl().y > lowPoint)
            {
                lowPoint = rect.tl().y;
                finalRect = rect;
            }
        }
    
        rectangle(dst, finalRect, Scalar(255, 255, 0));
        dst_img = src_img(finalRect);
    }
    
    
    imshow("dst_Img", dst_img);
    waitKey();
    return 0;
}

CMakeList.txt

cmake_minimum_required (VERSION 3.8)

project(opencv_idcard)

set(CMAKE_CXX_STANDARD 11)

add_executable (opencv_idcard "opencv_idcard.cpp" )

set(OpenCV_DIR "D:/develop/opencv-4.5.4/opencv-4.5.4-build")

find_package(OpenCV REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})

target_link_libraries(opencv_idcard ${OpenCV_LIBS})

實現(xiàn)效果

來看看通過一系列的處理效果吧:

接下來要干的事情就主要有兩件,首先是繼承tess-two到Android,這樣離線識別便搞定了,另外一件事情就是圖像預(yù)處理的代碼移植到Android上,這兩件事情完成便搞定了身份證號碼離線識別的功能了。

以上就是C++ OpenCV技術(shù)實戰(zhàn)之身份證離線識別的詳細內(nèi)容,更多關(guān)于C++ OpenCV身份證離線識別的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++使用遞歸函數(shù)和棧操作逆序一個棧的算法示例

    C++使用遞歸函數(shù)和棧操作逆序一個棧的算法示例

    這篇文章主要介紹了C++使用遞歸函數(shù)和棧操作逆序一個棧的算法,結(jié)合實例形式分析了C++遞歸函數(shù)與逆序棧的相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • C語言中的for循環(huán)語句基本語法及使用

    C語言中的for循環(huán)語句基本語法及使用

    這篇文章主要介紹了C語言中的for循環(huán)語句基本語法及使用,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • C和C++混合編程問題

    C和C++混合編程問題

    這篇文章主要介紹了C和C++混合編程問題,需要的朋友可以參考下
    2015-10-10
  • C++深入分析講解智能指針

    C++深入分析講解智能指針

    為了解決內(nèi)存泄漏的問題,C++中提出了智能指針。內(nèi)存泄漏的產(chǎn)生原因有很多,即使我們正確的使用malloc和free關(guān)鍵字也有可能產(chǎn)生內(nèi)存泄漏,如在malloc和free之間如果存在拋異常,那也會產(chǎn)生內(nèi)存泄漏。這種問題被稱為異常安全
    2022-05-05
  • Windows下Qt打包自動尋找依賴的DLL

    Windows下Qt打包自動尋找依賴的DLL

    本文介紹了兩種在Windows下使用Qt打包應(yīng)用程序并自動尋找依賴DLL的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • C++ const限定符以及頂層const和底層const的案例詳解

    C++ const限定符以及頂層const和底層const的案例詳解

    這篇文章主要介紹了C++ const限定符以及頂層const和底層const的案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++ 實現(xiàn)輸入含空格的字符串

    C++ 實現(xiàn)輸入含空格的字符串

    這篇文章主要介紹了C++ 實現(xiàn)輸入含空格的字符串,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 淺談C語言中的指針和數(shù)組有什么區(qū)別

    淺談C語言中的指針和數(shù)組有什么區(qū)別

    C語言中的指針和數(shù)組是兩個重要的數(shù)據(jù)結(jié)構(gòu),它們在內(nèi)存管理和數(shù)據(jù)存儲方面有許多相似之處,但也存在一些關(guān)鍵的區(qū)別,本文就來介紹一下C語言中的指針和數(shù)組有什么區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • C語言柔性數(shù)組詳解

    C語言柔性數(shù)組詳解

    這篇文章主要介紹了C語言柔性數(shù)組,通過實例分析了不完整類型、結(jié)構(gòu)體及柔性數(shù)組等概念,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • C語言之函數(shù)遞歸的實現(xiàn)

    C語言之函數(shù)遞歸的實現(xiàn)

    本文主要介紹了C語言之函數(shù)遞歸的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07

最新評論

绵竹市| 甘肃省| 上高县| 青田县| 齐齐哈尔市| 清丰县| 榆社县| 平邑县| 长白| 纳雍县| 新源县| 永新县| 清水县| 嘉兴市| 东乌| 黎川县| 水城县| 武威市| 贵南县| 竹北市| 黑龙江省| 万年县| 云和县| 北安市| 鹰潭市| 莱州市| 安徽省| 襄汾县| 文安县| 西青区| 杭锦旗| 浑源县| 昭觉县| 普宁市| 襄樊市| 五大连池市| 齐齐哈尔市| 尚义县| 股票| 毕节市| 安达市|