c++ 纯 opencv 实现电表数字识别(车牌类似)

本文介绍了一种使用C++和OpenCV库实现电表数字识别的方法,与之前实现扑克牌识别的步骤相似。主要包括从摄像头获取图片、图像预处理、轮廓检测、数字区域提取、边界定位、数字提取及KNN模型训练和测试等步骤。
摘要由CSDN通过智能技术生成

和之前的博客C++ 纯 OpenCV 实现扑克牌实时识别步骤一样。

完成电表数字的识别主要步骤有:

  1. 从摄像头获取电表图片,调整图片大小
  2. 二值化后执行闭运算,去除散乱的孤立点
  3. 找轮廓,包含数字的矩形轮廓区域,可通过面积大小和长宽比来唯一确定
  4. 使用漫水填充算法把轮廓四周的多余的背景变成黑色,数字为白色
  5. 找到轮廓的上下边界,即白色区域边界
  6. 从左到右找到数字的左右边界
  7. 提取数字,可放入KNN进行训练得到预测模型
  8. 加载模型进行测试
//Author: fengqi

#include <iostream>
#include <fstream>
#include <opencv2/opencv.hpp>
#include <string>

using namespace std;
using namespace cv;
using namespace cv::ml;

int dst_l(Mat &dst, int start);
int dst_r(Mat &dst, int start);
int dst_t(Mat &dst);
int dst_b(Mat &dst);
void train_pixel();
int predict(Mat &img);

int main(int argc,char** argv)
{
   
	string name1="a.jpg"; //预测的图片
	Mat img1 = imread(name1, 0); //读入图片
	Mat dst, mid;
	resize(img1, img1, Size(1920, 1080)); //调整大小
	threshold(img1, mid, 100, 255, THRESH_BINARY); //二值化 可调参数 100
	imshow("二值化",mid);
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
	morphologyEx(mid, mid, MORPH_CLOSE, element); //闭运算
	imshow("闭运算",mid);
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(mid, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE); //找轮廓
	for (int i = 0; i < contours.size(); i++)
	{
   
		RotatedRect rect = minAreaRect(contours[i]); //轮廓矩形
		if (rect.size.width < rect.size.height)
		{
   
			float temp = rect.size.width;
			rect.size.width = rect.size.height;
			rect.size.height = temp;
		}
		//面积和比例满足要求
		if (rect.size.width / rect.size.height > 3 && rect.size.width / rect.size.height < 4 && rect.size.area
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值