test.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #include <iostream>
  2. #include <vector>
  3. #include "opencv2/highgui/highgui.hpp"
  4. #include <opencv2/opencv.hpp>
  5. #include "opencv2/core/core.hpp"
  6. #include "IDCardRecogAux.h"
  7. #include "IIDCardRecognition.h"
  8. #define DATA_LOADNET 1
  9. #define PATH_LOADNET 0 && !DATA_LOADNET
  10. #define EVA_ONE_IMG 1
  11. #define EVA_MORE_IMG 0 && !EVA_ONE_IMG
  12. #define ONNX 1
  13. #define NCNN !ONNX
  14. #if _DEBUG
  15. #pragma comment(lib,"IDCardRecognitionLibsd.lib")
  16. #else
  17. #pragma comment(lib,"IDCardRecognitionLibs.lib")
  18. #endif
  19. //using namespace cv;
  20. using namespace std;
  21. using namespace IDCardRecognitionLibs;
  22. void ReadFileContent(const std::string& filePath, const void*& detData, size_t& detLen);
  23. const char* GetIdInforRecongStatusString(IdInforRecongStatus status);
  24. int main()
  25. {
  26. void* hIDCardRecognition = CreateIDCardRecognition();
  27. int* idCard = static_cast<int*>(hIDCardRecognition);
  28. std::locale::global(std::locale("zh_CN.UTF-8"));
  29. std::string imgpath = "H:\\Git\\Fork\\Lilith\\Vital\\IDCardRecogntion\\SourceCode\\Bin\\x64\\Release\\test4.png";
  30. cv::Mat srcimg = cv::imread(imgpath);
  31. int width = srcimg.cols;
  32. int height = srcimg.rows;
  33. IDCardRecogResult result;
  34. // 加载模型
  35. #if PATH_LOADNET
  36. string netDir = "./Networks/onnx/";
  37. LoadNetWorksDir(idCard, netDir.c_str());
  38. #elif DATA_LOADNET
  39. #if ONNX
  40. std::string decPath = "H:\\Git\\Fork\\Lilith\\Vital\\IDCardRecogntion\\SourceCode\\Bin\\x64\\Release\\Networks\\ch_PP-OCRv4_det_infer.onnx";
  41. const void* detData = nullptr;
  42. size_t detLen = 0;
  43. ReadFileContent(decPath, detData, detLen);
  44. std::string recPath = "H:\\Git\\Fork\\Lilith\\Vital\\IDCardRecogntion\\SourceCode\\Bin\\x64\\Release\\Networks\\ch_PP-OCRv4_rec_infer.onnx";
  45. const void* recData = nullptr;
  46. size_t recLen = 0;
  47. ReadFileContent(recPath, recData, recLen);
  48. std::string recKeyPath = "H:\\Git\\Fork\\Lilith\\Vital\\IDCardRecogntion\\SourceCode\\Bin\\x64\\Release\\Networks\\ppocr_keys_v1.txt";
  49. const void* recKeyData = nullptr;
  50. size_t recKeyLen = 0;
  51. ReadFileContent(recKeyPath, recKeyData, recKeyLen);
  52. std::string clsPath = "H:\\Git\\Fork\\Lilith\\Vital\\IDCardRecogntion\\SourceCode\\Bin\\x64\\Release\\Networks\\ch_ppocr_mobile_v2.0_cls_train.onnx";
  53. const void* clsData = nullptr;
  54. size_t clsLen = 0;
  55. ReadFileContent(clsPath, clsData, clsLen);
  56. ModelDataArray modeBuffer;
  57. modeBuffer.modelCount = 4;
  58. modeBuffer.modelDatas = new ModelData[4];
  59. modeBuffer.modelDatas[0].data = detData;
  60. modeBuffer.modelDatas[0].size = detLen;
  61. modeBuffer.modelDatas[0].identifier = "dectModelOnnx";
  62. modeBuffer.modelDatas[1].data = recData;
  63. modeBuffer.modelDatas[1].size = recLen;
  64. modeBuffer.modelDatas[1].identifier = "recModelOnnx";
  65. modeBuffer.modelDatas[2].data = recKeyData;
  66. modeBuffer.modelDatas[2].size = recKeyLen;
  67. modeBuffer.modelDatas[2].identifier = "keyTxt";
  68. modeBuffer.modelDatas[3].data = clsData;
  69. modeBuffer.modelDatas[3].size = clsLen;
  70. modeBuffer.modelDatas[3].identifier = "clsModelOnnx";
  71. LoadNetWorks(idCard, modeBuffer);
  72. //ModelDatasOnnx modeBuffer;
  73. //modeBuffer.detData = detData;
  74. //modeBuffer.detLen = detLen;
  75. //modeBuffer.recData = recData;
  76. //modeBuffer.recLen = recLen;
  77. //modeBuffer.recKeysData = recKeyData;
  78. //modeBuffer.recKeysLen = recKeyLen;
  79. //modeBuffer.clsData = clsData;
  80. //modeBuffer.clsLen = clsLen;
  81. //LoadNetWorksOnnx(idCard, modeBuffer);
  82. #else
  83. std::string filePath = "";
  84. filePath = "H:\\Git\\Fork\\Lilith\\Vital\\IDCardRecogntion\\SourceCode\\Bin\\x64\\Release\\Networks\\ch_PP-OCRv4_det_infer.bin";
  85. const void* detBin = nullptr;
  86. size_t detBinLen = 0;
  87. ReadFileContent(filePath, detBin, detBinLen);
  88. filePath = "H:\\Git\\Fork\\Lilith\\Vital\\IDCardRecogntion\\SourceCode\\Bin\\x64\\Release\\Networks\\ch_PP-OCRv4_det_infer.param";
  89. const void* detParam = nullptr;
  90. size_t detParamLen = 0;
  91. ReadFileContent(filePath, detParam, detParamLen);
  92. filePath = "H:\\Git\\Fork\\Lilith\\Vital\\IDCardRecogntion\\SourceCode\\Bin\\x64\\Release\\Networks\\ch_PP-OCRv3_rec.bin";
  93. const void* recBin = nullptr;
  94. size_t recBinLen = 0;
  95. ReadFileContent(filePath, recBin, recBinLen);
  96. filePath = "H:\\Git\\Fork\\Lilith\\Vital\\IDCardRecogntion\\SourceCode\\Bin\\x64\\Release\\Networks\\ch_PP-OCRv3_rec.param";
  97. const void* recParam = nullptr;
  98. size_t recParamLen = 0;
  99. ReadFileContent(filePath, recParam, recParamLen);
  100. filePath = "H:\\Git\\Fork\\Lilith\\Vital\\IDCardRecogntion\\SourceCode\\Bin\\x64\\Release\\Networks\\ppocr_keys_v1.txt";
  101. const void* keyTxt = nullptr;
  102. size_t keyTxtLen = 0;
  103. ReadFileContent(filePath, keyTxt, keyTxtLen);
  104. std::vector<std::string> supportedIdentifiers = { "dectModelOnnx", "recModelOnnx", "clsModelOnnx",
  105. "decBinNcnn", "decParamNcnn", "recBinNcnn", "recParamNcnn", "keyTxt" };
  106. ModelDataArray modeBuffer;
  107. modeBuffer.modelCount = 5;
  108. modeBuffer.modelDatas = new ModelData[5];
  109. modeBuffer.modelDatas[0].data = detBin;
  110. modeBuffer.modelDatas[0].size = detBinLen;
  111. modeBuffer.modelDatas[0].identifier = "decBinNcnn";
  112. modeBuffer.modelDatas[1].data = detParam;
  113. modeBuffer.modelDatas[1].size = detParamLen;
  114. modeBuffer.modelDatas[1].identifier = "decParamNcnn";
  115. modeBuffer.modelDatas[2].data = recBin;
  116. modeBuffer.modelDatas[2].size = recBinLen;
  117. modeBuffer.modelDatas[2].identifier = "recBinNcnn";
  118. modeBuffer.modelDatas[3].data = recParam;
  119. modeBuffer.modelDatas[3].size = recParamLen;
  120. modeBuffer.modelDatas[3].identifier = "recParamNcnn";
  121. modeBuffer.modelDatas[4].data = keyTxt;
  122. modeBuffer.modelDatas[4].size = keyTxtLen;
  123. modeBuffer.modelDatas[4].identifier = "keyTxt";
  124. LoadNetWorks(idCard, modeBuffer);
  125. //ModelDatasNcnn modeBuffer;
  126. //modeBuffer.detBinData = detBin;
  127. //modeBuffer.detBinLen = detBinLen;
  128. //modeBuffer.detParamData = detParam;
  129. //modeBuffer.detParamLen = detParamLen;
  130. //modeBuffer.recBinData = recBin;
  131. //modeBuffer.recBinLen = recBinLen;
  132. //modeBuffer.recParamData = recParam;
  133. //modeBuffer.recParamLen = recParamLen;
  134. //modeBuffer.recKeysData = keyTxt;
  135. //modeBuffer.recKeysLen = keyTxtLen;
  136. //LoadNetWorksNcnn(idCard, modeDataInforIn);
  137. #endif
  138. #endif
  139. ImageInfo imgInfo;
  140. imgInfo.Width = width;
  141. imgInfo.Height = height;
  142. imgInfo.ColorType = Rgb;
  143. imgInfo.DataBuffer = srcimg.data;
  144. // 推理图像
  145. #if EVA_MORE_IMG
  146. // 循环推理单张图 可以一直调用 EvaluateOneImage
  147. //for (int i = 0; i < 10; ++i) {
  148. // bool success = EvaluateOneImage(idCard, imgInfo, result);
  149. // if (success) {
  150. // std::cout << "Iteration " << i + 1 << ": Evaluation successful" << std::endl;
  151. // }
  152. // else {
  153. // std::cout << "Iteration " << i + 1 << ": Evaluation failed" << std::endl;
  154. // }
  155. //}
  156. //ReleaseIDCardRecognition(idCard);
  157. #elif EVA_ONE_IMG
  158. bool success = EvaluateOneImageStruct(idCard, imgInfo, result);
  159. if (success)
  160. {
  161. std::cout << "Evaluation successful!" << std::endl;
  162. std::cout << "NumerStatus:" << GetIdInforRecongStatusString(result.Status) << std::endl;
  163. std::cout << "Name:" << result.Name << std::endl;
  164. std::cout << "Gender:" << result.Gender << std::endl;
  165. std::cout << "Ntion:" << result.Nation << std::endl;
  166. std::cout << "IDNum:" << result.IdNumber << std::endl;
  167. std::cout << "Birthdate:" << result.Birthdate << std::endl;
  168. std::cout << "Address:" << result.Address << std::endl;
  169. std::cout << "TimeSpan:" << result.TimeSpan << std::endl;
  170. }
  171. else
  172. {
  173. std::cerr << "Evaluation failed" << std::endl;
  174. }
  175. #endif
  176. return 0;
  177. }
  178. void ReadFileContent(const std::string& filePath, const void*& detData, size_t& detLen) {
  179. // 创建文件输入流
  180. std::ifstream file(filePath, std::ios::binary);
  181. // 检查文件是否成功打开
  182. if (!file.is_open()) {
  183. std::cerr << "Error opening file!" << std::endl;
  184. return;
  185. }
  186. // 获取文件大小
  187. file.seekg(0, std::ios::end);
  188. detLen = file.tellg();
  189. file.seekg(0, std::ios::beg);
  190. // 分配足够的内存以容纳文件内容
  191. char* data = new char[detLen];
  192. detData = data;
  193. // 从文件读取内容到内存中
  194. file.read(data, detLen);
  195. // 关闭文件
  196. file.close();
  197. }
  198. // 将枚举值映射到字符串的函数
  199. const char* GetIdInforRecongStatusString(IdInforRecongStatus status)
  200. {
  201. switch (status)
  202. {
  203. case IDINFOR_SUCCESSED_All:
  204. return "IDINFOR_SUCCESSED_All";
  205. case IDINFOR_SUCCESSED_PART:
  206. return "IDINFOR_SUCCESSED_PART";
  207. case IDINFOR_SUCCESSED_ID:
  208. return "IDINFOR_SUCCESSED_ID";
  209. case IDINFOR_FAILED:
  210. return "IDINFOR_FAILED";
  211. default:
  212. return "Unknown Status";
  213. }
  214. }