蓝牌,黄牌,绿牌都能准确识别,颜色识别的方法采用车牌数字识别后,再去截取车牌区域的颜色进行分类识别
具体调用代码如下:
#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include "qdebug.h"
#include "qpushbutton.h"
#include "QFileDialog"
#include <QLoggingCategory>
#include "qlayout.h"
#include "qlabel.h"
#include "qfile.h"
void drawRect(cv::Mat image,cv::Rect rect)
{
cv::Point p1(rect.x,rect.y);
cv::Point p2(rect.x+rect.width,rect.y+rect.height);
cv::rectangle(image,p1,p2,cv::Scalar(0,255,0),1);
}
void getMaxClass(cv::Mat &probBlob, int *classId, double *classProb)
{
// cv::Mat probMat = probBlob.matRefConst().reshape(1, 1); //reshape the blob to 1x1000 matrix
cv::Point classNumber;
cv::minMaxLoc(probBlob, NULL, classProb, NULL, &classNumber);
*classId = classNumber.x;
}
/*
-----------Levenshtein距离(度量车牌识别效果)------------
编辑距离Edit Distance,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数;
Levenshtein距离算法可见:https://blog.csdn.net/qq844352155/article/details/38686549;
@s1 : 字符串1;
@s2 : 字符串2;
*/
template<class T>
static unsigned int levenshtein_distance(const T &s1, const T &s2){
//获取s1、s2的字符长;
const size_t len1 = s1.size(), len2 = s2.size();
//声明col和prevCol辅助计算;
//col记录的是最新的计数情况;
//prevCol记录的是上一轮的计数情况;
std::vector<unsigned int> col(len2 + 1), prevCol(len2 + 1);
//迭代给prevCol赋值;
for (unsigned int i = 0; i < prevCol.size(); i++) prevCol[i] = i;
//迭代比较;扫描两字符串(n*m级的);
for (unsigned int i = 0; i < len1; i++) {
col[0] = i + 1;
//迭代遍历s2[j] in s2;
for (unsigned int j = 0; j < len2; j++)
//比较是否不一样,交换代价最小方式优先;
col[j + 1] = min(
min(prevCol[1 + j] + 1, col[j] + 1),
prevCol[j] + (s1[i] == s2[j] ? 0 : 1));
//col与prevCol交换其内容(swap函数:prevCol的类型要与该vector一样,大小可以不同.);
col.swap(prevCol);
}
//返回结果;
return prevCol[len2];
}
QImage MatToQImage(const Mat& mat)
{
// 8-bits unsigned, NO. OF CHANNELS = 1
if(mat.type() == CV_8UC1)
{
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
// Set the color table (used to translate colour indexes to qRgb values)
image.setColorCount(256);
for(int i = 0; i < 256; i++)
{
image.setColor(i, qRgb(i, i, i));