c++ opencv的简单数字识别

需求

  1. 视频内固定位置有一段GPS车速,需要提取每一帧的车速作为信号标志。
  2. 车速为:0~120,准确率不需要太高,尽量识别

视频样式

在这里插入图片描述

识别结果

在这里插入图片描述

流程

  1. 选择一到两个不同视频
  2. 提取视频待识别区域。
  3. 将每个数字单独提取出来。
  4. 每个视频选择0~9数字保存各一个作为模板。
  5. 进行模板匹对。

代码

// 数字模板匹配
// 参数一:需要匹配的数字roi区域
// 参数二:模板一
// 参数二:模板二

int getSpeed(const cv::Mat& roiImage, vector<cv::Mat> myTemplate, vector<cv::Mat> myTemplate_2)
{
	for (int j = 0; j < 10; j++)
	{
		cv::Mat matDst1, matDst2;
		cv::resize(roiImage, matDst1, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);
		cv::resize(myTemplate[j], matDst2, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);

		int iAvg1 = 0, iAvg2 = 0;
		int arr1[64], arr2[64];

		for (int i = 0; i < 8; i++)
		{
			uchar* data1 = matDst1.ptr<uchar>(i);
			uchar* data2 = matDst2.ptr<uchar>(i);

			int tmp = i * 8;

			for (int j = 0; j < 8; j++)
			{
				int tmp1 = tmp + j;

				arr1[tmp1] = data1[j] / 4 * 4;
				arr2[tmp1] = data2[j] / 4 * 4;

				iAvg1 += arr1[tmp1];
				iAvg2 += arr2[tmp1];
			}
		}

		iAvg1 /= 64;
		iAvg2 /= 64;

		for (int i = 0; i < 64; i++)
		{
			arr1[i] = (arr1[i] >= iAvg1) ? 1 : 0;
			arr2[i] = (arr2[i] >= iAvg2) ? 1 : 0;
		}

		int iDiffNum = 0;

		for (int i = 0; i < 64; i++)
			if (arr1[i] != arr2[i])
				++iDiffNum;

		//cout << "iDiffNum = " << iDiffNum << endl;
		if (iDiffNum <= 7)
		{
			return j;
		}

	}
	return 0}

// 模板加载
vector<cv::Mat> myTemplate;
for (int i = 0; i < 10; i++)
{
	cv::Mat temp = cv::imread("./number/" + to_string(i) + ".jpg", 0);
	myTemplate.push_back(temp);
	
}

// 数字ROI区域获取
cv::Rect temp;
temp.x = 578;
temp.y = 60;
temp.width = 12;
temp.height = 31;
cv::Mat roiImage1(frame, cv::Rect(temp));
cv::cvtColor(roiImage1, roiImage1, cv::COLOR_BGR2GRAY);
//cv::imshow("1", roiImage1);

// 先存为模板
cv::imwrite("./number_2/" + to_string(rand() % 300) + ".jpg", roiImage1);    //写入文件

// 模板比对
int result3 = getSpeed(roiImage3, myTemplate, myTemplate_2);
cout << endl;
要在Java中使用OpenCV识别数字,您需要完成以下步骤: 1.安装OpenCV库:下载OpenCV的Java库并将其添加到您的项目中。 2.准备训练数据集:您需要准备一个包含数字图像的数据集,这些数字图像应该是已知标签的。 3.训练模型:使用OpenCV的机器学习库训练模型以识别数字。您可以使用支持向量机(SVM)或人工神经网络(ANN)等算法。 4.测试模型:对于测试数据集中的每个数字图像,使用训练好的模型进行识别并比较其预测结果和真实标签。 下面是一个简单的Java示例代码,演示如何使用OpenCV识别数字: ```java import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.ml.*; import java.util.ArrayList; import java.util.List; public class DigitRecognizer { public static void main(String[] args) { // Load training data Mat digits = new Mat(); Mat labels = new Mat(); List<Mat> digitList = new ArrayList<>(); for (int i = 0; i < 10; i++) { for (int j = 0; j < 500; j++) { Mat digit = Imgcodecs.imread("digit_data/" + i + "_" + j + ".png", Imgcodecs.IMREAD_GRAYSCALE); digitList.add(digit); labels.push_back(new Mat(1, 1, CvType.CV_32SC1, new Scalar(i))); } } Core.merge(digitList, digits); // Train SVM SVM svm = SVM.create(); svm.setType(SVM.C_SVC); svm.setKernel(SVM.RBF); svm.setGamma(0.5); svm.setC(10.0); svm.train(digits, Ml.ROW_SAMPLE, labels); // Load test data Mat testDigits = new Mat(); Mat testLabels = new Mat(); List<Mat> testDigitList = new ArrayList<>(); for (int i = 0; i < 10; i++) { for (int j = 500; j < 1000; j++) { Mat digit = Imgcodecs.imread("digit_data/" + i + "_" + j + ".png", Imgcodecs.IMREAD_GRAYSCALE); testDigitList.add(digit); testLabels.push_back(new Mat(1, 1, CvType.CV_32SC1, new Scalar(i))); } } Core.merge(testDigitList, testDigits); // Test SVM Mat results = new Mat(); svm.predict(testDigits, results, 0); // Evaluate results int correct = 0; for (int i = 0; i < testLabels.rows(); i++) { if (testLabels.get(i, 0)[0] == results.get(i, 0)[0]) { correct++; } } double accuracy = (double) correct / testLabels.rows() * 100; System.out.println("Accuracy: " + accuracy + "%"); } } ``` 此代码加载包含数字图像的训练数据集,并使用SVM算法训练模型。然后,它加载包含数字图像的测试数据集,并使用训练好的模型对其进行分类。最后,它评估结果并输出分类准确度。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能视界探索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值