需求
- 视频内固定位置有一段GPS车速,需要提取每一帧的车速作为信号标志。
- 车速为:0~120,准确率不需要太高,尽量识别
视频样式
识别结果
流程
- 选择一到两个不同视频
- 提取视频待识别区域。
- 将每个数字单独提取出来。
- 每个视频选择0~9数字保存各一个作为模板。
- 进行模板匹对。
代码
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;
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);
}
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::imwrite("./number_2/" + to_string(rand() % 300) + ".jpg", roiImage1);
int result3 = getSpeed(roiImage3, myTemplate, myTemplate_2);
cout << endl;