|
|
|
@ -4,7 +4,7 @@
|
|
|
|
|
Namespace where all the C++ EasyPR functionality resides
|
|
|
|
|
*/
|
|
|
|
|
namespace easypr{
|
|
|
|
|
|
|
|
|
|
//int iiname=0;
|
|
|
|
|
CPlateDetect::CPlateDetect()
|
|
|
|
|
{
|
|
|
|
|
//cout << "CPlateDetect" << endl;
|
|
|
|
@ -55,7 +55,7 @@ int CPlateDetect::plateDetect(Mat src, vector<Mat>& resultVec, int index)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int CPlateDetect::plateDetectDeep(Mat src, vector<Mat>& resultVec, bool showDetectArea, int index)
|
|
|
|
|
int CPlateDetect::plateDetectDeep(Mat src, vector<CPlate>& resultVec, bool showDetectArea, int index)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
vector<Mat> resultPlates;
|
|
|
|
@ -70,10 +70,8 @@ int CPlateDetect::plateDetectDeep(Mat src, vector<Mat>& resultVec, bool showDete
|
|
|
|
|
//如果颜色查找找到n个以上(包含n个)的车牌,就不再进行Sobel查找了。
|
|
|
|
|
const int color_find_max = m_maxPlates;
|
|
|
|
|
|
|
|
|
|
Mat result;
|
|
|
|
|
src.copyTo(result);
|
|
|
|
|
|
|
|
|
|
m_plateLocate->plateColorLocate(src, color_Plates, index);
|
|
|
|
|
|
|
|
|
|
m_plateJudge->plateJudge(color_Plates, color_result_Plates);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -84,17 +82,12 @@ int CPlateDetect::plateDetectDeep(Mat src, vector<Mat>& resultVec, bool showDete
|
|
|
|
|
RotatedRect minRect = plate.getPlatePos();
|
|
|
|
|
Point2f rect_points[4];
|
|
|
|
|
minRect.points(rect_points);
|
|
|
|
|
for (int j = 0; j < 4; j++)
|
|
|
|
|
line(result, rect_points[j], rect_points[(j + 1) % 4], Scalar(0, 255, 255), 2, 8);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
all_result_Plates.push_back(plate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (color_result_Plates.size() >= color_find_max)
|
|
|
|
|
{
|
|
|
|
|
//如果颜色查找找到n个以上(包含n个)的车牌,就不再进行Sobel查找了。
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
m_plateLocate->plateSobelLocate(src, sobel_Plates, index);
|
|
|
|
|
m_plateJudge->plateJudge(sobel_Plates, sobel_result_Plates);
|
|
|
|
@ -103,11 +96,7 @@ int CPlateDetect::plateDetectDeep(Mat src, vector<Mat>& resultVec, bool showDete
|
|
|
|
|
{
|
|
|
|
|
CPlate plate = sobel_result_Plates[i];
|
|
|
|
|
|
|
|
|
|
RotatedRect minRect = plate.getPlatePos();
|
|
|
|
|
Point2f rect_points[4];
|
|
|
|
|
minRect.points( rect_points );
|
|
|
|
|
for( int j = 0; j < 4; j++ )
|
|
|
|
|
line(result, rect_points[j], rect_points[(j+1)%4], Scalar(0,0,255), 2, 8 );
|
|
|
|
|
plate.bColored = false;
|
|
|
|
|
|
|
|
|
|
all_result_Plates.push_back(plate);
|
|
|
|
|
}
|
|
|
|
@ -117,85 +106,73 @@ int CPlateDetect::plateDetectDeep(Mat src, vector<Mat>& resultVec, bool showDete
|
|
|
|
|
{
|
|
|
|
|
// 把截取的车牌图像依次放到左上角
|
|
|
|
|
CPlate plate = all_result_Plates[i];
|
|
|
|
|
|
|
|
|
|
Mat plate_area = plate.getPlateMat();
|
|
|
|
|
|
|
|
|
|
int height = m_plateLocate->HEIGHT;
|
|
|
|
|
int width = m_plateLocate->WIDTH;
|
|
|
|
|
|
|
|
|
|
assert(height*i + height < result.rows);
|
|
|
|
|
|
|
|
|
|
Mat imageRoi = result(Rect(0, 0 + height*i, width, height));
|
|
|
|
|
addWeighted(imageRoi, 0, plate_area, 1, 0, imageRoi);
|
|
|
|
|
|
|
|
|
|
resultVec.push_back(plate_area);
|
|
|
|
|
resultVec.push_back(plate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (showDetectArea)
|
|
|
|
|
{
|
|
|
|
|
namedWindow("EasyPR", CV_WINDOW_AUTOSIZE);
|
|
|
|
|
showResult(result);
|
|
|
|
|
destroyWindow("EasyPR");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (0)
|
|
|
|
|
{
|
|
|
|
|
stringstream ss(stringstream::in | stringstream::out);
|
|
|
|
|
ss << "image/tmp/" << index << "_" << 9 <<"_result" << ".jpg";
|
|
|
|
|
imwrite(ss.str(), result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CPlateDetect::showResult(const Mat& result)
|
|
|
|
|
{
|
|
|
|
|
const int RESULTWIDTH = 640; //640 930
|
|
|
|
|
const int RESULTHEIGHT = 540; //540 710
|
|
|
|
|
const int RESULTWIDTH = 1000; //640 930
|
|
|
|
|
const int RESULTHEIGHT = 810; //540 710
|
|
|
|
|
|
|
|
|
|
Mat img_window;
|
|
|
|
|
img_window.create(RESULTHEIGHT, RESULTWIDTH, CV_8UC3);
|
|
|
|
|
/*if(cbgImage_ && cbgImage_->width == result.cols/4*4 && cbgImage_->height == result.rows)
|
|
|
|
|
{
|
|
|
|
|
for (int i=0;i<cbgImage_->height;++i)
|
|
|
|
|
{
|
|
|
|
|
for (int j=0;j<cbgImage_->width;++j)
|
|
|
|
|
{
|
|
|
|
|
cbgImage_->imageData[i*cbgImage_->widthStep+j*3] = result.data[i*result.step[0]+j*3+2];
|
|
|
|
|
cbgImage_->imageData[i*cbgImage_->widthStep+j*3+1] = result.data[i*result.step[0]+j*3+2+1];
|
|
|
|
|
cbgImage_->imageData[i*cbgImage_->widthStep+j*3+2] = result.data[i*result.step[0]+j*3];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int nRows = result.rows;
|
|
|
|
|
int nCols = result.cols;
|
|
|
|
|
}
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Mat result_resize;
|
|
|
|
|
if (nCols <= img_window.cols && nRows <= img_window.rows) {
|
|
|
|
|
result_resize = result;
|
|
|
|
|
//Mat img_window;
|
|
|
|
|
//img_window.create(RESULTHEIGHT, RESULTWIDTH, CV_8UC3);
|
|
|
|
|
|
|
|
|
|
} else if (nCols > img_window.cols && nRows <= img_window.rows) {
|
|
|
|
|
float scale = float(img_window.cols) / float(nCols);
|
|
|
|
|
resize(result, result_resize, Size(), scale, scale, CV_INTER_AREA);
|
|
|
|
|
//int nRows = result.rows;
|
|
|
|
|
//int nCols = result.cols;
|
|
|
|
|
|
|
|
|
|
} else if (nCols <= img_window.cols && nRows > img_window.rows) {
|
|
|
|
|
float scale = float(img_window.rows) / float(nRows);
|
|
|
|
|
resize(result, result_resize, Size(), scale, scale, CV_INTER_AREA);
|
|
|
|
|
//Mat result_resize;
|
|
|
|
|
//if (nCols <= img_window.cols && nRows <= img_window.rows) {
|
|
|
|
|
// result_resize = result;
|
|
|
|
|
|
|
|
|
|
} else if (nCols > img_window.cols && nRows > img_window.rows) {
|
|
|
|
|
Mat result_middle;
|
|
|
|
|
float scale = float(img_window.cols) / float(nCols);
|
|
|
|
|
resize(result, result_middle, Size(), scale, scale, CV_INTER_AREA);
|
|
|
|
|
//} else if (nCols > img_window.cols && nRows <= img_window.rows) {
|
|
|
|
|
// float scale = float(img_window.cols) / float(nCols);
|
|
|
|
|
// resize(result, result_resize, Size(), scale, scale, CV_INTER_AREA);
|
|
|
|
|
|
|
|
|
|
if (result_middle.rows > img_window.rows) {
|
|
|
|
|
float scale = float(img_window.rows) / float(result_middle.rows);
|
|
|
|
|
resize(result_middle, result_resize, Size(), scale, scale, CV_INTER_AREA);
|
|
|
|
|
//} else if (nCols <= img_window.cols && nRows > img_window.rows) {
|
|
|
|
|
// float scale = float(img_window.rows) / float(nRows);
|
|
|
|
|
// resize(result, result_resize, Size(), scale, scale, CV_INTER_AREA);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
result_resize = result_middle;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
result_resize = result;
|
|
|
|
|
}
|
|
|
|
|
//} else if (nCols > img_window.cols && nRows > img_window.rows) {
|
|
|
|
|
// Mat result_middle;
|
|
|
|
|
// float scale = float(img_window.cols) / float(nCols);
|
|
|
|
|
// resize(result, result_middle, Size(), scale, scale, CV_INTER_AREA);
|
|
|
|
|
|
|
|
|
|
Mat imageRoi = img_window(Rect((RESULTWIDTH - result_resize.cols) / 2, (RESULTHEIGHT - result_resize.rows) / 2,
|
|
|
|
|
result_resize.cols, result_resize.rows));
|
|
|
|
|
addWeighted(imageRoi, 0, result_resize, 1, 0, imageRoi);
|
|
|
|
|
// if (result_middle.rows > img_window.rows) {
|
|
|
|
|
// float scale = float(img_window.rows) / float(result_middle.rows);
|
|
|
|
|
// resize(result_middle, result_resize, Size(), scale, scale, CV_INTER_AREA);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
imshow("EasyPR", img_window);
|
|
|
|
|
waitKey(0);
|
|
|
|
|
// }
|
|
|
|
|
// else {
|
|
|
|
|
// result_resize = result_middle;
|
|
|
|
|
// }
|
|
|
|
|
//} else {
|
|
|
|
|
// result_resize = result;
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//Mat imageRoi = img_window(Rect((RESULTWIDTH - result_resize.cols) / 2, (RESULTHEIGHT - result_resize.rows) / 2,
|
|
|
|
|
// result_resize.cols, result_resize.rows));
|
|
|
|
|
//addWeighted(imageRoi, 0, result_resize, 1, 0, imageRoi);
|
|
|
|
|
|
|
|
|
|
//imshow("EasyPR", img_window);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|