www.gusucode.com > 基于C++的TRY2LPR-1.0开源车牌识别核心-源码程序 > 基于C++的TRY2LPR-1.0开源车牌识别核心-源码程序\code\Cap\Cap.cpp
/* * Copyright (c) 2003, try2it.com * All rights reserved. * Download by http://www.NewXing.com * 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. * * 文件名称:Cap.cpp * 文件标识:LPR-01-001 * 摘要:牌照识别的图像获取接口Dll * * 当前版本:1.0 * 作者:try2it.com * 开始日期:2003年09月15日 * 完成日期:2003年09月20日 */ #include "stdafx.h" #include "Cap.h" #include "..\include\ijl.h" // 包含ijl.lib(JPEG图像解码) #pragma comment(lib, "..\\lib\\ijl15") // 定义全局变量 HWND g_hWnd = NULL; // 主程序窗口句柄 TCHAR g_szFileName[MAX_PATH] = ""; // 文件名 TCHAR g_szFileNameExt[MAX_PATH] = ""; const VERSION = 0x0101; // 版本号 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; } CAP_API int CALLAGREEMENT InitCapDll(HWND hWnd, WORD *Version) { g_hWnd = hWnd; *Version = VERSION; return 1; } CAP_API int CALLAGREEMENT GetAVI() { return 0; } CAP_API int CALLAGREEMENT GetImg(BYTE *Buffer, DWORD * dwBufferSize) { int res = 0; OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = g_hWnd; ofn.lpstrFilter = "JPG Files (*.jpg)\0*.jpg\0BMP Files (*.bmp)\0*.bmp\0All Files (*.*)\0*.*\0"; ofn.lpstrFile = g_szFileName; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; ofn.lpstrDefExt = "jpg"; if (_tcsclen(g_szFileName) == 0) { // 弹出选择文件对话框 if(GetOpenFileName(&ofn)) { // 获取文件扩展名 _tcscpy(g_szFileNameExt, g_szFileName+ofn.nFileExtension); // 如果后缀为BMP, 不区分大小写 if(_tcsicmp(g_szFileNameExt, _T("BMP"))==0) { res = LoadBMP(g_szFileName, Buffer, dwBufferSize); } else if (_tcsicmp(g_szFileNameExt, "JPG")==0) { res = LoadJPG(g_szFileName, Buffer, dwBufferSize); } } } else { // 如果后缀为BMP, 不区分大小写 if(_tcsicmp(g_szFileNameExt, _T("BMP"))==0) { res = LoadBMP(g_szFileName, Buffer, dwBufferSize); } else if (_tcsicmp(g_szFileNameExt, "JPG")==0) { res = LoadJPG(g_szFileName, Buffer, dwBufferSize); } memset(g_szFileName, 0, MAX_PATH); memset(g_szFileNameExt, 0, MAX_PATH); } // 如果失败,清除全局文件名和扩展名 if (0 == res) { memset(g_szFileName, 0, MAX_PATH); memset(g_szFileNameExt, 0, MAX_PATH); } return res; } CAP_API int CALLAGREEMENT SetCap() { // ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; return 0; } int LoadBMP(LPCTSTR szFileName, BYTE *Buffer, DWORD * dwBufferSize) { FILE *file; // 打开文件句柄 long lFileSize; // 文件大小 int nBytesRead; // 读取的文件大小 BYTE *FileBuffer = NULL; // 读取文件的缓冲区 BYTE *buf = NULL; // 临时空间 int res = 1; __try { // 读取图像文件 if ((file = ::_tfopen(szFileName, "rb")) == NULL) { res = 0; __leave; } // 获取文件大小 fseek(file, 0, SEEK_END); lFileSize = ftell(file); // 返回图像数据大小,不包括文件头 if (NULL == Buffer) { *dwBufferSize = (DWORD)lFileSize - sizeof(BITMAPFILEHEADER); res = 1; __leave; } *dwBufferSize = (DWORD)lFileSize - sizeof(BITMAPFILEHEADER); // 申请临时空间 if ((buf = (BYTE*)malloc(*dwBufferSize))==NULL) { res = 0; __leave; } // 到文件开头, 要跳过文件头 fseek(file, sizeof(BITMAPFILEHEADER), SEEK_SET); // 读取位图数据 nBytesRead = fread(buf, sizeof(BYTE), lFileSize - sizeof(BITMAPFILEHEADER), file); } // __try __finally { // 拷贝数据到调用方 if (NULL != Buffer) memcpy(Buffer, buf, *dwBufferSize); // 释放临时空间 if (buf) free(buf); // 关闭文件句柄 if (file) fclose(file); } // __finally return res; } int LoadJPG(LPCTSTR szFileName, BYTE *Buffer, DWORD * dwBufferSize) { int res; IJLERR jerr; int width; int height; DWORD nchannels; DWORD dib_line_width; DWORD dib_pad_bytes; DWORD wholeimagesize; BITMAPINFOHEADER *bmih = NULL; // Allocate the IJL JPEG_CORE_PROPERTIES structure. JPEG_CORE_PROPERTIES jcprops; BYTE *buf = NULL; // JPG文件 res = 1; __try { // 初始化IJL库 jerr = ijlInit(&jcprops); // 初始化不成功 if(IJL_OK != jerr) { res = 0; __leave; } // 获取JPG图像的信息(高度,宽度,等) jcprops.JPGFile = const_cast<LPSTR>(szFileName); jerr = ijlRead(&jcprops,IJL_JFILE_READPARAMS); if(IJL_OK != jerr) { res = 0; __leave; } // 设置本地数据 width = jcprops.JPGWidth; height = jcprops.JPGHeight; // 解压缩为24位位图 nchannels = 3; // 计算 DIB padding dib_line_width = width * nchannels; dib_pad_bytes = IJL_DIB_PAD_BYTES(width,nchannels); // 计算希望的象素缓冲区大小 wholeimagesize = ( dib_line_width + dib_pad_bytes ) * height; // 返回图像数据尺寸 if (NULL == Buffer) { *dwBufferSize = sizeof(BITMAPINFOHEADER) + wholeimagesize; res = 1; __leave; } // 申请临时空间 *dwBufferSize = sizeof(BITMAPINFOHEADER) + wholeimagesize; if ((buf = (BYTE*)malloc(*dwBufferSize)) == NULL) { res =0; __leave; } bmih = reinterpret_cast<BITMAPINFOHEADER*>(buf); bmih->biSize = sizeof(BITMAPINFOHEADER); bmih->biWidth = width; bmih->biHeight = height; bmih->biPlanes = 1; bmih->biBitCount = 24; bmih->biCompression = BI_RGB; bmih->biSizeImage = 0; bmih->biXPelsPerMeter = 0; bmih->biYPelsPerMeter = 0; bmih->biClrUsed = 0; bmih->biClrImportant = 0; // 设置希望的DIB数据信息 jcprops.DIBWidth = width; jcprops.DIBHeight = -height; // DIB数据倒序 jcprops.DIBChannels = nchannels; jcprops.DIBColor = IJL_BGR; jcprops.DIBPadBytes = dib_pad_bytes; jcprops.DIBBytes = reinterpret_cast<BYTE*>(buf + sizeof(BITMAPINFOHEADER)); // 设置JPG颜色空间 switch(jcprops.JPGChannels) { case 1: { jcprops.JPGColor = IJL_G; break; } case 3: { jcprops.JPGColor = IJL_YCBCR; break; } default: { jcprops.DIBColor = (IJL_COLOR)IJL_OTHER; jcprops.JPGColor = (IJL_COLOR)IJL_OTHER; break; } } // 解码 jerr = ijlRead(&jcprops,IJL_JFILE_READWHOLEIMAGE); if(IJL_OK != jerr) { res = 0; __leave; } } // __try __finally { // 拷贝数据,传送到调用方 if (NULL != Buffer) memcpy(Buffer, buf, *dwBufferSize); // 释放临时空间 if (buf) free(buf); // 释放IJL库 ijlFree(&jcprops); } // __finally return res; }