CLion+OpenCV 识别身份证号码---检测身份证号码

OpenCV 编译

1.下载OpenCV windows 源码

2.安装CMake(带GUI的)

3.下载MinGW

4.添加环境变量(MinGW的bin目录和CMake的bin目录)

5.在OpenCV源码的build同目录下创建build-mginw文件夹

6.配置CMake

具体的可以参考:Windows10+CLion+OpenCV4.5.2开发环境搭建 - 飘杨...... - 博客园

如果出现opencv_videoio模块报错可以参考下面的链接

OPENCV编译Videoio模块问题解决_fengxueniu的博客-CSDN博客

CLion环境搭建

新建一个新的项目;Cmakelist 导入OpenCV

Cmakelist添加代码:

cmake_minimum_required(VERSION 3.17)
project(IDdect)

set(CMAKE_CXX_STANDARD 14)

add_executable(IDdect main.cpp)

#添加代码
set(OpenCV_DIR F:/opencvWin/opencv/build-mginw)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

target_link_libraries(IDdect ${OpenCV_LIBS})
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;
#define DEFAULT_CARD_WIDTH 640
#define DEFAULT_CARD_HEIGHT 400
#define  FIX_IDCARD_SIZE Size(DEFAULT_CARD_WIDTH,DEFAULT_CARD_HEIGHT)

int main() {
    Mat dts;
    Mat source_image;
    Mat dst_img;
    Mat src = imread("C:\\Users\\As10906\\Desktop\\pjl.jpg");
    if(src.empty())
    {
        fprintf(stderr, "Can not load image\n");
        return -1;
    }

    imshow("src",src);
    //压缩格式
    resize(src,src,FIX_IDCARD_SIZE);
//    resize(src,src,Size(640,400),0,0,INTER_LINEAR);
    imshow("resize",src);
    source_image = src;
    //灰度图

    cvtColor(src,dts,COLOR_BGR2GRAY);
    imshow("gray",dts);

    //二值化
    threshold(dts,dts,100,255,CV_THRESH_BINARY);
    imshow("threshold",dts);

    //腐蚀+ 膨胀
    Mat erodeElement = getStructuringElement(MORPH_RECT,Size(20,10));
    erode(dts, dts, erodeElement);
    imshow("erode",dts);

    vector< vector<Point> > contours;
    vector<Rect> rects;
    findContours(dts, contours, rects,RETR_LIST, CHAIN_APPROX_SIMPLE, Point(0, 0));

    for (int i = 0; i < contours.size(); i++)
    {
        Rect rect = boundingRect(contours.at(i));
        rectangle(dts, rect, Scalar(0, 0, 255));  // 在dst 图片上显示 rect 矩形
        imshow("rectangle",dts);
        if (rect.width > rect.height * 11) {//根据宽高比定义 18位 13:1
            rects.push_back(rect);
//            rectangle(source_image, rect, Scalar(0,255,255));//rect是满足比例的坐标  将满足条件的坐标绘制在原图上
//            dst_img = source_image(rect);
            //由于图片拍照原因可能导致把住址那一行或其他行判断成身份证号
        }
    }
    //健壮性判断---拿到超过比例的集合坐标点rects,再遍历拿出y值最大的 也就是最靠近身份证底下
    if(rects.size() ==1 ){
        Rect rect = rects.at(0);
        dst_img = source_image(rect);
    }else{
        int lowPoint = 0;
        Rect finalRect;
        for (int 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(source_image,finalRect,Scalar(255,255,0));
        }
        dst_img = source_image(finalRect);
    }

    imshow("aim",dst_img);

    waitKey();//相当于VS 中的inputkey  阻塞等待操作,不然所有的图片效果会一闪而过
    return 0;
}

原图:

效果:

至此就拿到了身份证号码的关键图片,下一步导入Android Studio进行图片中号码识别即可

效果图查看路径:https://download.csdn.net/download/xxwbwm/29939726

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值