基于OpenCV的简单机读卡识别

一、简单介绍

最近在整理学习笔记,发现以前做的一个机读卡识别程序还挺有意思的,用的是C++和OpenCV,算法比较简单,主要是回顾一下图片识别的一些基本思路,顺便做一下算法的优化。

PS:以前的C++代码风格真的惨不忍睹,而且没有注释,23333

这是这个程序需要识别的机读卡:

二、步骤回顾

2.1 图像处理

2.1.1 图像的二值化

一般情况我们需要识别的图片基本都是三通道的彩色图像。

而图像的处理一般都会需要讲这些图像进行二值化的处理,让整个图像呈现出明显的只有黑和白的视觉效果,便于进行图像的分割和识别。

现将图片先转换为灰度图,然后再进行二值化处理:

bool loadImage(const char * src_path, cv::Mat& binary_img)
{
   
	// 原图以灰度图形式加载
	// 以及加载异常的处理
	cv::Mat src_img = cv::imread(src_path);
	if (src_img.empty())
	{
   
		std::cout << "IMAGE LOAD FAILDED!"<< std::endl;
		return false;
	}
	cv::Mat src_gary_img;
	cv::cvtColor(src_img, src_gary_img, CV_BGR2GRAY);
	// 自适应阈值的二值化处理
	// 将灰度图转换为二值图
	cv::adaptiveThreshold(src_gary_img, binary_img,
		255, 0, 1, 101, 10);
	return true;
}

这是处理的效果:

2.1.2 ROI(region of interest,感兴趣区域)的分割

这张图片的ROI就是数字信息和选择题答案的区域,我们需要将其单独分割出来。

对于这张图片而言就是寻找最大连通域并且切割出来:

cv::Mat getMaxContourRect(const cv::Mat& src)
{
   
	// 查找该图片的所有连通域
	std::vector<std::vector<cv::Point>>contours;
	cv::findContours(src, contours,
		CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
	// 寻找最大连通域
	std::vector<cv::Point> max_contours;
	double max_area_value = 0.0;
	for (auto iter = contours.begin(); iter != 
		contours.end(); iter++)
	{
   
		double area = cv::contourArea(<
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值