1.hyperlpr 识别流程是什么?
1)PlateDetection::plateDetectionRough:cascade.detectMultiScale,粗检测一些车牌位置(并向外扩一部分0.3w, 2h),即剪切的车牌图片
2)resize到140x60, 转换成gray, 使用不同阈值进行cv::adaptiveThreshold,同一个车牌图片,得到多个阈值图片,对于面积大概符合车牌文字的contour, 满足:if (( lwRatio>0.7&&bdbox.width*bdbox.height>100 && bdboxAera<300)|| (lwRatio>3.0 && bdboxAera<100 && bdboxAera>10)), 记录下左上和右下角点
3)对于得到的很多左上点,使用cv::fitLine, 拟合直线,得到(vx,vy,x0,y0), 其中(vx, vy)是直线方向的模为1的向量,(x0,y0) 为直线上的点
int lefty = static_cast<int>((-x * vy / vx) + y);//求图片上左边的y
int righty = static_cast<int>(((136- x) * vy / vx) + y);//求与图片右边相交的y
res.first = lefty+PADDING_UP_DOWN+zeroadd;
res.second = righty+PADDING_UP_DOWN+zeroadd;
4)进行角度矫正:由于fitLine可能有误差,导致文字有倾斜,所以通过fastdeskew,进行矫正,使用:
下面 的x2,y2,相当于理解为椭圆的一个半径,从而求得这个blocksize,的纹理角度
cv::Mat eigen;
cv::cornerEigenValsAndVecs(skewImage,eigen,blockSize,5);
//eigen:lambda1, lambda2, x0,y0, x1,y1
for( int j = 0; j < skewImage.rows; j+=blockSize )
{ for( int i = 0; i < skewImage.cols; i+=blockSize )
{
float x2 = eigen.at<cv::Vec6f>(j, i)[4];
float y2 = eigen.at<cv::Vec6f>(j, i)[5];
int angle_cell = angle(x2,y2);//感觉这里,x,y顺序写反了。其实没有写反,后面求了余角
angle_list[(angle_cell + 180)%180]+=1.0;
}
}
5)然后使用一个简单的网络模型,输出两个小数,乘以宽,就是左右两边的其实x,切掉左边和右边多余部分
6)最后送入识别模型识别
2.opencv mat clone和copyTo是什么区别?
clone调用copyTo,一样的
3.bitwise_not如何操作图像
4.cmake如何使得项目输出的二进制文件,在指定目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY, $(CMAKE_CURRENT_DIRECTORY))
5. CMakeLists.txt设置了set(CMAKE_C_FLAGS_DEBUG "-g -DDEBUG")
set(CMAKE_CXX_FLAGS_DEBUG "-g -DDEBUG"), 也无法调试,提示gdb xx 提示无法load symbol怎么处理?
设置set(CMAKE_BUILD_TYPE, DEBUG),这样就可以了
6.cornerEigenValsAndVecs(skewImage,eigen,blockSize,sobel_window_size)的作用是什么?
求一个图像,每个blockSize,里面梯度矩阵的特征值和特征向量,两个特征值的根号分之一,分别为椭圆的两个半径:
参考:https://www.cnblogs.com/ronny/p/4009425.html
7.Harris角点检测,其矩阵,特征值,特征向量分别代表什么意义?
矩阵代表,一个窗口中,先对每个点,求梯度,构成
,然后窗口所有点梯度矩阵求和。
特征值,代表椭圆的两个半径 ,所以两个特征值都 比较大,那么表示是一个角点。
8.hyperlpr车牌检测使用的是什么算法?
使用的是haar特征的 cascade forest检测算法
9.识别用的什么算法?
conv,relu,maxpool
conv,relu, maxpool
conv, relu,
dense, relu
dense,relu
10.实测效果:
一些复杂情况,无法检测出,建议使用dnn方式检测车牌,crnn检测文字