int CPlateDetect::plateDetect(Mat src, vector<Mat>& resultVec, int index)
{
	//可能是车牌的图块集合
	vector<Mat> matVec;

	int resultLo = m_plateLocate->plateLocate(src, matVec);

	if (0 != resultLo)
		return -1;

	int resultJu = m_plateJudge->plateJudge(matVec, resultVec);
		
	if(getPDDebug())
	{ 
		int size = resultVec.size();
		for (int i = 0; i < size; i++)
		{
			Mat img = resultVec[i];
			if(1)
			{
				stringstream ss(stringstream::in | stringstream::out);
				ss << "image/tmp/plate_judge_result_" << i << ".jpg";
				imwrite(ss.str(), img);
			}
		}
	}	


	if (0 != resultJu)
		return -2;

	return 0;
}
Esempio n. 2
0
// !车牌识别模块
int CPlateRecognize::plateRecognize(Mat src, std::vector<string> &licenseVec) {
    // 车牌方块集合
    vector<CPlate> plateVec;

    // 进行深度定位,使用颜色信息与二次Sobel
    int resultPD = plateDetect(src, plateVec, getPDDebug(), 0);

    if (resultPD == 0) {
        int num = plateVec.size();
        int index = 0;

        //依次识别每个车牌内的符号
        for (int j = 0; j < num; j++) {
            CPlate item = plateVec[j];
            Mat plate = item.getPlateMat();

            //获取车牌颜色
            string plateType = getPlateColor(plate);

            //获取车牌号
            string plateIdentify = "";
            int resultCR = charsRecognise(plate, plateIdentify);
            if (resultCR == 0) {
                string license = plateType + ":" + plateIdentify;
                licenseVec.push_back(license);
            }
        }
        //完整识别过程到此结束

        //如果是Debug模式,则还需要将定位的图片显示在原图左上角
        if (getPDDebug() == true) {
            Mat result;
            src.copyTo(result);

            for (int j = 0; j < num; j++) {
                CPlate item = plateVec[j];
                Mat plate = item.getPlateMat();

                int height = 36;
                int width = 136;
                if (height * index + height < result.rows) {
                    Mat imageRoi = result(Rect(0, 0 + height * index, width, height));
                    addWeighted(imageRoi, 0, plate, 1, 0, imageRoi);
                }
                index++;

                RotatedRect minRect = item.getPlatePos();
                Point2f rect_points[4];
                minRect.points(rect_points);

                Scalar lineColor = Scalar(255, 255, 255);

                if (item.getPlateLocateType() == SOBEL) lineColor = Scalar(255, 0, 0);

                if (item.getPlateLocateType() == COLOR) lineColor = Scalar(0, 255, 0);

                for (int j = 0; j < 4; j++)
                    line(result, rect_points[j], rect_points[(j + 1) % 4], lineColor, 2,
                         8);
            }

            //显示定位框的图片
            showResult(result);
        }
    }

    return resultPD;
}
Esempio n. 3
0
// !车牌识别模块
int CPlateRecognize::plateRecognize(Mat src, vector<string>& licenseVec, int index)
{
	// 车牌方块集合
	vector<CPlate> plateVec;
	
	// 如果设置了Debug模式,就依次显示所有的图片
	bool showDetectArea = getPDDebug();

	// 进行深度定位,使用颜色信息与二次Sobel
	int resultPD = plateDetectDeep(src, plateVec, showDetectArea, 0);

	Mat result;
	src.copyTo(result);

	if (resultPD == 0)
	{
		int num = plateVec.size();
		int index = 0;

		for (int j = 0; j < num; j++)
		{
			CPlate item = plateVec[j];		
			Mat plate = item.getPlateMat();
			
			//获取车牌颜色
			string plateType = getPlateColor(plate);

			//获取车牌号
			string plateIdentify = "";
			int resultCR = charsRecognise(plate, plateIdentify);
			if (resultCR == 0)
			{
				string license = plateType + ":" + plateIdentify;
				licenseVec.push_back(license);

				/*int height = 36;
				int width = 136;
				if(height*index + height < result.rows)
				{
					Mat imageRoi = result(Rect(0, 0 + height*index, width, height));
					addWeighted(imageRoi, 0, plate, 1, 0, imageRoi);				 				
				}
				index++;*/

				RotatedRect minRect = item.getPlatePos();
				Point2f rect_points[4]; 
				minRect.points( rect_points );

				if(item.bColored)
				{
					for (int j = 0; j < 4; j++)
						line(result, rect_points[j], rect_points[(j + 1) % 4], Scalar(255, 255, 0), 2, 8);
				}
				else
				{
					for( int j = 0; j < 4; j++ )
						line(result, rect_points[j], rect_points[(j+1)%4], Scalar(0,0,255), 2, 8 );//sobel定位车牌,红色方框
				}							
			}
		}
	}

	if (showDetectArea)
		showResult(result);

	return resultPD;
}