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进行图片中号码识别即可