www.gusucode.com > 基于C++的TRY2LPR-1.0开源车牌识别核心-源码程序 > 基于C++的TRY2LPR-1.0开源车牌识别核心-源码程序\code\LPR\LPR.cpp
//Download by http://www.NewXing.com /* * Copyright (c) 2003, try2it.com * All rights reserved. * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. * * 文件名称:Lpr.cpp * 文件标识:LPR-02-01 * 摘要:牌照识别的主出口Dll * * 当前版本:1.0 * 作者:try2it.com * 开始日期:2003年09月15日 * 完成日期:2003年09月30日 */ #include "stdafx.h" #include "../include/types.h" #include <malloc.h> #include "LPRHelper.h" #include "LPRProcess.h" #include "LPR.h" #include "../Reco/Reco.h" #include "../Cap/Cap.h" #pragma comment(lib, "..\\lib\\Reco") #pragma comment(lib, "..\\lib\\Cap") /*------------------------------------------------------------------ * 以下声明全局变量 ------------------------------------------------------------------*/ HWND g_hWnd = NULL; // 全局调用窗口句柄 const VERSION = 0x0101; // 版本号 char g_szFileName[MAX_PATH]; // 配置文件名 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { char pModuleFileName[MAX_PATH]; int i; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: memset(pModuleFileName, 0, MAX_PATH); memset(g_szFileName, 0, MAX_PATH); GetModuleFileName((HMODULE)hModule, pModuleFileName, MAX_PATH); i = strlen(pModuleFileName); while(pModuleFileName[i]!='\\' || i<=0) { i--; } memcpy(g_szFileName, pModuleFileName, i+1); strcat(g_szFileName, "GDCLPR.ini"); ReadParam(g_szFileName); //SaveParam(80,220,40,160,100,0,0,0,0,g_szFileName); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; } LPR_API int CALLAGREEMENT InitLPRDll(HWND hWnd, WORD *Version) { InitCapDll(hWnd, Version); g_hWnd = hWnd; *Version = VERSION; return 1; } LPR_API int CALLAGREEMENT GetLPRAVI() { return GetAVI(); } LPR_API int CALLAGREEMENT GetLPR(PLPInfo pLPInfo, BYTE* pImgBuff) { TColorImg ColorImg; TColorImg CutColorImg; TColorImg LPColorImg; TGrayImg InteImg; TGrayImg MedianImg; TGrayImg LPGrayImg; TGrayImg LPTwoImg; TGrayImg RectifyImg; TGrayImg AccurateImg; TGrayImg LPCharImg[MAX_LPCHAR_COUNT]; TGrayImg TempGrayImg; TColorID ColorID; int CharCount; double MaxBlackRatio, MinBlackRatio; int Threshold; RECT Rect; RECT AccurateRect; RECT LPCharRect[MAX_LPCHAR_COUNT]; RECT CutRect; int LeftOffset, RightOffset, TopOffset, BottomOffset; char LPNum[MAX_LPCHAR_COUNT]; int res = 0; int i; BYTE *pBuff = NULL; DWORD dwBufferSize = 0; __try { __try { strcpy(pLPInfo->LPNum, "??????\0"); pLPInfo->LPColor = LP_BLUE; pLPInfo->LPRect.left = 0; pLPInfo->LPRect.right = 0; pLPInfo->LPRect.top = 0; pLPInfo->LPRect.bottom = 0; if (pImgBuff==NULL) { res = GetImg(NULL, &dwBufferSize); if (0 == res) __leave; pBuff = (BYTE*)malloc(dwBufferSize); if (pBuff == NULL) { res = 0; __leave; } res = GetImg(pBuff, &dwBufferSize); if (0 == res) __leave; pImgBuff = pBuff; } res = LoadImgToArray(&ColorImg, pImgBuff); if (0 == res) __leave; CutRect = GetManualCutRect(&LeftOffset, &RightOffset, &TopOffset, &BottomOffset, ColorImg.Width, ColorImg.Height); res = GetSubColorImg(&CutColorImg, &ColorImg, CutRect); if (0 == res) __leave; res = ColorImg_Free(&ColorImg); if (0 == res) __leave; TempGrayImg = ColorToGray(CutColorImg); res = InteEqualize(&InteImg, &TempGrayImg); if (0 == res) __leave; res = MedianFilter(&MedianImg, &InteImg, 3, 3, 1, 1); if (0 == res) __leave; res = GrayImg_Free(&InteImg); if (0 == res) __leave; res = GetLPPos(&Rect, &MedianImg); if (0 == res) __leave; res = GetSubColorImg(&LPColorImg, &CutColorImg, Rect); if (0 == res) __leave; res = GetSubImg(&LPGrayImg, &MedianImg, Rect); if (0 == res) __leave; res = ColorImg_Free(&CutColorImg); if (0 == res) __leave; res = GrayImg_Free(&MedianImg); if (0 == res) __leave; res = RecoLPColor(&ColorID, &LPColorImg); if (0 == res) return 0; switch (ColorID) { case LP_BLACK: case LP_BLUE: MaxBlackRatio = 0.80; MinBlackRatio = 0.75; break; case LP_WHITE: case LP_YELLOW: res = Invert(&LPGrayImg, &LPGrayImg); if (0 == res) __leave; MaxBlackRatio = 0.65; MinBlackRatio = 0.60; break; } res = TwoPixelLPImg(&LPTwoImg, &LPGrayImg, MaxBlackRatio, MinBlackRatio, &Threshold); if (0 == res) __leave; res = ColorImg_Free(&LPColorImg); if (0 == res) __leave; res = GrayImg_Free(&LPGrayImg); if (0 == res) __leave; res = RectifyLP(&RectifyImg, &LPTwoImg, &LPTwoImg); if (0 == res) __leave; res = GrayImg_Free(&LPTwoImg); if (0 == res) __leave; res = GetLPAccuratePos(&AccurateRect, &RectifyImg); if (0 == res) __leave; res = GetSubImg(&AccurateImg, &RectifyImg, AccurateRect); if (0 == res) __leave; res = GrayImg_Free(&RectifyImg); if (0 == res) __leave; res = GetLPCharPos(&CharCount, LPCharRect, &AccurateImg); if (0 == res) __leave; for (i=0; i<MAX_LPCHAR_COUNT; i++) { LPCharImg[i].Width = 0; LPCharImg[i].Height = 0; LPCharImg[i].pImg = NULL; } for (i=CharCount-1; i>=0; i--) { res = GetSubImg(&LPCharImg[MAX_LPCHAR_CURRENT_COUNT-1+i-(CharCount-1)], &AccurateImg, LPCharRect[i]); if (0 == res) __leave; } res = GrayImg_Free(&AccurateImg); if (0 == res) __leave; for (i=0; i<MAX_LPCHAR_COUNT; i++) LPNum[i] = 0; for (i=1; i<=1; i++) { res = GetReco(&LPNum[i-1], &LPCharImg[i], LPNUM_EN); if (0 == res) __leave; } for (i=2; i<=3; i++) { res = GetReco(&LPNum[i-1], &LPCharImg[i], LPNUM_ENNUM); if (0 == res) __leave; } for (i=4; i<MAX_LPCHAR_CURRENT_COUNT; i++) { res = GetReco(&LPNum[i-1], &LPCharImg[i], LPNUM_NUM); if (0 == res) __leave; } for (i=CharCount-1; i>=0; i--) { res = GrayImg_Free(&LPCharImg[MAX_LPCHAR_CURRENT_COUNT-1+i-(CharCount-1)]); if (0 == res) __leave; } strcpy(pLPInfo->LPNum, LPNum); pLPInfo->LPColor = ColorID; pLPInfo->LPRect.left = Rect.left+LeftOffset; pLPInfo->LPRect.right = Rect.right+LeftOffset; pLPInfo->LPRect.top = Rect.top+TopOffset; pLPInfo->LPRect.bottom = Rect.bottom+TopOffset; } __finally { if (pBuff != NULL) { free(pBuff); pBuff = NULL; } FreeAllMemNode(); } } __except(EXCEPTION_EXECUTE_HANDLER) { } return res; } LPR_API int CALLAGREEMENT SetLPR() { return 1; } LPR_API int CALLAGREEMENT SetLPRCap() { return SetCap(); } LPR_API int CALLAGREEMENT SetLPRReco() { return SetReco(); }