- 1、前言
- 2、开发环境
- 3、整体思路
- 4、先看效果
- 5、C++实现
OpenCV是什么?
OpenCV(Open Source Computer Vision Library)是一个开源、跨平台(Windows、Linux、Android、Mac OS)的图像处理库;比如常见的身份证识别,车牌识别,抖音的视频特效,人脸识别等,都是用它来实现的。
【疑问】除了OpenCV,还有什么类似的图像处理库吗?
答案:有,“Halcon” 也是一个非常优秀的图像处理库,但它是收费、闭源的。当然收费自然有收费的好处:性能快,简单易用,开发快。类似于Linux与Mac OS的关系,你觉得哪个好呢?想白嫖?——用OpenCV吧
2、开发环境本文用C++语言开发,还不会的同学请自行充电,例如:C++基础教程
OpenCV支持在Windows、Linux、Mac OS上开发,推荐大家在Windows上开发,不为别的,就为少折腾。亲测,在Mac、Linux上面折腾的都是泪!
Windows上配置环境比较简单(具体教程,可自行搜索):
(1)安装Visual Studio;
(2)安装opencv程序;
(3)配置环境变量;
(4)在Visual Studio中创建项目并配置VC++目录;
下面贴下我用的版本;
- Microsoft Visual Studio Community 2022 (64 位) - Current
版本 17.2.3 - opencv-4.5.5-vc14_vc15
【Android中选择图片】——>【使用OpenCV截取身份证号码区域】——>【使用Tesseract-OCR识别身份证号码字符】
本文主要讲述【使用OpenCV截取身份证号码区域】
识别后的身份证号码图片
文件:IDCardRead.cpp
#include#include #define CARD_SIZE Size(640, 400) using namespace cv; using namespace std; void handleImage(Mat& src) { Mat src_img = src; Mat dst_img; //imshow("原图", src_img); Mat dst; // 图像缩放至 640*400 resize(src_img, src_img, CARD_SIZE); imshow("图像缩放", src_img); // 灰度化 cvtColor(src_img, dst, COLOR_BGR2GRAY); //imshow("灰度化", dst); // 二值化 threshold(dst, dst, 100, 255, THRESH_BINARY); //imshow("二值化", dst); // 膨胀 Mat erodeElement = getStructuringElement(MORPH_RECT, Size(20, 10)); erode(dst, dst, erodeElement); //imshow("膨胀", dst); // 轮廓检测 vector > contours; vector rects; findContours(dst, contours, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); for (int i = 0; i < contours.size(); i++) { Rect rect = boundingRect(contours.at(i)); rectangle(dst, rect, Scalar(0, 255)); //imshow("轮廓", dst); // 筛选轮廓图片 if (rect.width > rect.height * 9) { rects.push_back(rect); rectangle(dst, rect, Scalar(0, 0, 255)); } } if (rects.size() == 1) { dst_img = src_img(rects.at(0)); } else { Rect rectTmp = rects.at(0); // 遍历查找Y坐标最大的轮廓 for (int i = 0; i < rects.size(); ++i) { Rect rect = rects.at(i); if (rect.tl().y > rectTmp.tl().y) { rectTmp = rect; } } rectangle(dst, rectTmp, Scalar(255, 255, 0)); dst_img = src_img(rectTmp); } imshow("号码图片", dst_img); } int main() { std::cout << "身份证识别n"; Mat im = imread("D:\下载\cid.jpg"); handleImage(im); waitKey(0); return 0; }
下面是图像处理每一步的运行效果:
灰度化
将彩色图片变为灰度图像;方便后面的图像算法处理。
二值化
膨胀
轮廓检测
裁剪号码区域



