Android 識別身份證號碼(圖片識別)

前些天下午沒什么事,朋友有個需求掸刊,說要識別身份證上面的身份證號碼免糕,剛好閑著,就幫他解決了一下,不說多完美石窑,但是至少算是解決需求了牌芋,好了,閑話少說尼斧。
先來看一下我的DEMO吧

Paste_Image.png

接下來我們一個個介紹(Demo我會放在最下面)

1.聯(lián)網(wǎng)識別

也是從別人的Demo里截出來的姜贡,其實(shí)也是用的別人的一個在線接口,但是我看了看應(yīng)該算“非正常調(diào)用”(這個意思大家自己理解吧)棺棵。下面分析一下這個方法的優(yōu)劣點(diǎn)吧楼咳。
優(yōu)點(diǎn):速度極快,上傳照片烛恤,會返回身份證上所有信息母怜,包括姓名 地址 出生等等
缺點(diǎn):“非正常”調(diào)用就有一定的不可靠性缚柏,如果哪天人家關(guān)了或者改了這個接口苹熏,就比較尷尬了,當(dāng)然你可以選擇購買人家的正式版币喧。

Paste_Image.png

2.本地識別

基于Tess_two做的識別轨域,這個大家可放心使用。先看一下大概怎么使用吧杀餐!

首先引用:

compile 'com.rmtheis:tess-two:6.0.0'

然后使用干发,其實(shí)使用起來很簡單,但是要注意幾點(diǎn)
1.要在SD卡有他的識別庫史翘,這個庫你可以理解為一個字典枉长,這個字典可以自己訓(xùn)練,因?yàn)槲沂怯玫膭e人訓(xùn)練好的(只包含英文和數(shù)字)琼讽,所以就不說怎么訓(xùn)練了必峰,百度一下會有很多。
2.需要注意的是钻蹬,放他字典的路徑文件夾名必須為“tessdata”吼蚁,否則報錯
好了,準(zhǔn)備工作做好了问欠,接下來介紹怎么使用肝匆,我直接貼核心代碼,代碼有注釋溅潜,看不懂的留言或者私信我

    //訓(xùn)練數(shù)據(jù)路徑,tessdata
    static final String TESSBASE_PATH = Environment.getExternalStorageDirectory() + "/";
    //識別語言英文
    static final String DEFAULT_LANGUAGE = "eng";

    /**
     * 傳SD卡圖片路徑(當(dāng)然你們也可以傳Bitmap)
     * @param url
     */
    private void localre(String url) {
        //把圖片轉(zhuǎn)為Bitmap
        Bitmap bmp = BitmapFactory.decodeFile(url);
        //創(chuàng)建Tess
        final TessBaseAPI baseApi = new TessBaseAPI();
        //下面這一塊代碼為裁取身份證號碼區(qū)域(否則識別亂碼薪伏,不準(zhǔn)確)
        int x, y, w, h;
        x = (int) (bmp.getWidth() * 0.340);
        y = (int) (bmp.getHeight() * 0.800);
        w = (int) (bmp.getWidth() * 0.6 + 0.5f);
        h = (int) (bmp.getHeight() * 0.12 + 0.5f);
        Bitmap bit_hm = Bitmap.createBitmap(bmp, x, y, w, h);
        //這個只是我將裁取的號碼區(qū)展示在了一個ImageView上滚澜,這個可以沒有
        iv_number.setImageBitmap(bit_hm);
        //初始化OCR的訓(xùn)練數(shù)據(jù)路徑與語言
        baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
        //設(shè)置識別模式
        baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
        //設(shè)置要識別的圖片
        baseApi.setImage(bit_hm);
        //設(shè)置字典白名單
        baseApi.setVariable("tessedit_char_whitelist", "0123456789Xx");
        //把識別內(nèi)容設(shè)置到EditText里
        tv_result.setText(baseApi.getUTF8Text());
        //收尾
        baseApi.clear();
        baseApi.end();
    }

OK,就這么簡單,圖片清晰切裁取區(qū)域正確的情況下嫁怀,準(zhǔn)確度幾乎100%设捐;
給大家舉個身份證照片的例子吧借浊,否則裁取號碼會不正確

Paste_Image.png

上一張結(jié)果圖

Paste_Image.png

實(shí)時識別

其實(shí)就是本地識別的拓展版,把攝像頭的數(shù)據(jù)轉(zhuǎn)為Bitmap,去識別萝招,還是貼核心代碼吧蚂斤,看不懂的自己下Demo研究。

    /**
     * 攝像頭數(shù)據(jù)回調(diào)
     * @param data
     * @param camera
     */
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        camera.addCallbackBuffer(data);
        //將byte數(shù)組轉(zhuǎn)為Bitmap
        ByteArrayOutputStream baos;
        byte[] rawImage;
        Bitmap bitmap;
        Camera.Size previewSize = camera.getParameters().getPreviewSize();//獲取尺寸,格式轉(zhuǎn)換的時候要用到
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        newOpts.inJustDecodeBounds = true;
        YuvImage yuvimage = new YuvImage(
                data,
                ImageFormat.NV21,
                previewSize.width,
                previewSize.height,
                null);
        baos = new ByteArrayOutputStream();
        yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 100, baos);// 80--JPG圖片的質(zhì)量[0-100],100最高
        rawImage = baos.toByteArray();
        //將rawImage轉(zhuǎn)換成bitmap
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length, options);
        if (bitmap == null) {
            Log.d("zka", "bitmap is nlll");
            return;
        } else {
            //裁取圖片中央身份證區(qū)域
            int height = bitmap.getHeight();
            int width = bitmap.getWidth();
            final Bitmap bitmap1 = Bitmap.createBitmap(bitmap, width/2 - dip2px(150),height / 2 - dip2px(92), dip2px(300), dip2px(185));
            //截取身份證號碼區(qū)域
            int x, y, w, h;
            x = (int) (bitmap1.getWidth() * 0.340);
            y = (int) (bitmap1.getHeight() * 0.800);
            w = (int) (bitmap1.getWidth() * 0.6 + 0.5f);
            h = (int) (bitmap1.getHeight() * 0.12 + 0.5f);
            Bitmap bit_hm = Bitmap.createBitmap(bitmap1, x, y, w, h);
           // 識別
            if(bit_hm != null){
                String localre = localre(bit_hm);
                if (localre.length() == 18) {
                    Log.e(TAG, "onPreviewFrame: "+localre );
                    Toast.makeText(getApplicationContext(),localre,Toast.LENGTH_SHORT).show();
                }
            }
        }
    }


    /**
     * 識別
     * @param bm
     * @return
     */
    private String localre(Bitmap bm) {
        String content = "";
        bm = bm.copy(Bitmap.Config.ARGB_8888, true);
        iv_result.setImageBitmap(bm);
        TessBaseAPI baseApi = new TessBaseAPI();
        baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
        //設(shè)置識別模式
        baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
        //設(shè)置要識別的圖片
        baseApi.setImage(bm);
        baseApi.setVariable("tessedit_char_whitelist", "0123456789Xx");
        Log.e(TAG, "localre: "+ baseApi.getUTF8Text());
        content = baseApi.getUTF8Text();
        baseApi.clear();
        baseApi.end();
        return content;
    }

Paste_Image.png
Ok槐沼,就這樣吧曙蒸!核心也就這些東西,有問題的可以留言或私信岗钩,有好的解決辦法也可以交流纽窟,喜歡的話點(diǎn)個喜歡或者給個Start吧,出于隱私兼吓,就把人家的信息打碼臂港, 不過識別出來準(zhǔn)確度是100%

GitHub直達(dá):https://github.com/bertsir/IDCardRecognition

2019.10.21 提示:全面屏手機(jī)需要調(diào)整裁切參數(shù),否則實(shí)時識別無效J硬I竽酢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浑娜,一起剝皮案震驚了整個濱河市佑力,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棚愤,老刑警劉巖搓萧,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宛畦,居然都是意外死亡瘸洛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門次和,熙熙樓的掌柜王于貴愁眉苦臉地迎上來反肋,“玉大人,你說我怎么就攤上這事踏施∈幔” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵畅形,是天一觀的道長养距。 經(jīng)常有香客問我,道長日熬,這世上最難降的妖魔是什么棍厌? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上耘纱,老公的妹妹穿的比我還像新娘敬肚。我一直安慰自己,他們只是感情好束析,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布艳馒。 她就那樣靜靜地躺著,像睡著了一般员寇。 火紅的嫁衣襯著肌膚如雪弄慰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天丁恭,我揣著相機(jī)與錄音曹动,去河邊找鬼。 笑死牲览,一個胖子當(dāng)著我的面吹牛墓陈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播第献,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼贡必,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庸毫?” 一聲冷哼從身側(cè)響起仔拟,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎飒赃,沒想到半個月后利花,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡载佳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年炒事,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔫慧。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡挠乳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姑躲,到底是詐尸還是另有隱情睡扬,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布黍析,位于F島的核電站卖怜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏阐枣。R本人自食惡果不足惜马靠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一牍戚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虑粥,春花似錦、人聲如沸宪哩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锁孟。三九已至彬祖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間品抽,已是汗流浹背储笑。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圆恤,地道東北人突倍。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像盆昙,于是被迫代替她去往敵國和親羽历。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評論 25 707
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議淡喜。它實(shí)...
    香橙柚子閱讀 23,809評論 8 183
  • 第1章 人物介紹 女主: 慕容冰璃 出生日期:1999秕磷。9。21 身高:177 體重:41kg 家人:爸爸炼团,媽媽澎嚣,...
    慢性流浪ESPORTS閱讀 246評論 0 0
  • 概念 VR 虛擬現(xiàn)實(shí)(Virtual Reality)就是讓你看到一個三維的虛擬世界。一般由計(jì)算機(jī)生成這個虛擬世界...
    熊妹妹閱讀 380評論 5 1
  • 我的工具們終于等到你了瘟芝!超開心的易桃! 昨天寫的手帳 昨天我的工具們~ 昨天我的貼紙們~ 還有一些我的貼紙們~ 每日一...
    南笙莫寒閱讀 453評論 0 1