From 521273638d783d2fbfb7083c92a31564348aa6eb Mon Sep 17 00:00:00 2001 From: UnknownObject Date: Mon, 19 May 2025 21:56:27 +0800 Subject: [PATCH] change recognizer output format --- DLLUsageDemo/DLLUsageDemo.cpp | 4 ++-- DLLUsageDemo/LibEasyOCR-CPP.h | 5 +++-- DLLUsageDemo/LibEasyOCR-CPP.lib | Bin 21786 -> 21854 bytes DLLUsageDemo/LibEasyOCR-CPPd.lib | Bin 21828 -> 21894 bytes EasyOCR-CPP/EasyOCR-CPP.cpp | 23 +++++++++++++---------- EasyOCR-CPP/EasyOCR_Recognizer.cpp | 2 +- EasyOCR-CPP/OCRToolBox.h | 5 +++-- LibEasyOCR-CPP/EasyOCR_Recognizer.cpp | 2 +- LibEasyOCR-CPP/LibEasyOCR-CPP.h | 5 +++-- LibEasyOCR-CPP/OCRConfig.cpp | 3 +++ LibEasyOCR-CPP/OCRConfig.h | 2 -- LibEasyOCR-CPP/OCRToolBox.h | 5 +++-- 12 files changed, 32 insertions(+), 24 deletions(-) diff --git a/DLLUsageDemo/DLLUsageDemo.cpp b/DLLUsageDemo/DLLUsageDemo.cpp index ed2a79a..5c0fb05 100644 --- a/DLLUsageDemo/DLLUsageDemo.cpp +++ b/DLLUsageDemo/DLLUsageDemo.cpp @@ -37,8 +37,8 @@ int main() auto results = uns::EasyOCR_CPP::FullAuto(img); for (const auto& [index, info] : results) { - const auto& [text, conf] = info; - std::cout << "Box " << index << ": \"" << uns::EOCR_SupportTools::WtoA(text) << "\" Confidence=" << conf << "\n"; + const auto& [text, conf, rect] = info; + printf("Result %d: Text = {%s}, Box = [%d, %d, %d, %d], Confidence = %.3f\n", (int)index, uns::EOCR_SupportTools::WtoA(text).c_str(), rect.tl().x, rect.tl().y, rect.br().x, rect.br().y, conf); } uns::EasyOCR_CPP::CleanupOCR(); diff --git a/DLLUsageDemo/LibEasyOCR-CPP.h b/DLLUsageDemo/LibEasyOCR-CPP.h index 61b5714..ca935a3 100644 --- a/DLLUsageDemo/LibEasyOCR-CPP.h +++ b/DLLUsageDemo/LibEasyOCR-CPP.h @@ -32,8 +32,9 @@ namespace uns EN_CH }; - using EOCR_Result = std::pair; - using EOCR_ResultSet = std::map; + using EOCR_Result = std::tuple; + using EOCR_Result_Single = std::tuple; + using EOCR_ResultSet = std::map; using EOCRD_Rects = std::vector>; } diff --git a/DLLUsageDemo/LibEasyOCR-CPP.lib b/DLLUsageDemo/LibEasyOCR-CPP.lib index a49b7996930db5b7fa07ff8896ed9a748459af75..400cb3dfe8900b6ffcf5e2d7d058b76670a4191f 100644 GIT binary patch delta 2016 zcmcJQYfPI}7{~twN_pFt0;2`Sr7as50}RTBgK;S>*A~j9+!LK+nfs(0`>+{YG76X> zBU71A3=12ML=%-5vd~CaOcpi~G-d&mL?v;NEE3$v2pDxi9X@YgGeYJE!)B9TPtQ5e z`&{1hKTrFI6t{;Iy;<%|^Zvai@26P}ARox`2eO?&P7h$cC{sQTNR%zg)OG_Bwq5_Q z#v@bLBvUjBNH{OcRL%hsh3ztBb?k?6xF`6FDR>~`ngk>qNir68=w+ElCcjO_Dso~> z&4^6Z7$D(Fkg4Y6CF~6{C3Zlfl#}uj!6T#1<*X(0<|XLFf#>N%MLn&Qw~{s8?Md}L zt_*0%k2`tl#LGviLo5v9NzKtCCl6We)+4W2tz@iB-D05LG@x`*PlLfa>J+xxY{QA3 z`qa;C3A7C-A#^|fBih)fqVrlK4Vr|f;c$plTH~gpRc8~O)h29N@Th}sitfxuLW^ak z`Dd{-vVoo);Gz{6F9#OOfbLpgmkn5Bnph&EMZjezFjon*7qYzAX2JnHC;%p1Kob9M zvH;6W8_QQ@Un4cZSQU`K`#se_1E0LzUBb>vfe2#jz7!Zw61S1IkP(nl?b|MOq*ntSBpoRiI|M_|Szd7)w8@XN792H4l$HbG#5KLpC z$rPbW_M{lj_-ww!?I}<1>5cux=YKrtQGJWYKk=9^-3#5#*^6|Bvpx~-)bj6awB_7ti7uYw&nq$rQy=_RL-}4(aErvaRu(DVxykugl3YxU)#Hwq%e`Te! zhWtPWlM^Y>)+oI7M(dKB7gco3HYL2!aQZiHO$ea8g1^M>JH6j!@=TB(csC@Du9g+i zaG_4KZcm*5i8s`o*|6~&8Z0V~&PbR0w@GT?8ymojU5+n`zqcs>4JnF~H;dh#h;$sK zh#E?CnpW4;d^<-MIr^Ki$7v!jluR}=C6wyK`|k{|SMXk-lyYiXHno>F30L+k{K?l3 zT3RUW6Rsb8b>=mm1yP6nD?w$w^ci1e1XI1^g3uP*HqMt9A++LnU6|1h%<}ce4sw^B z6Yj?UeCr&~LMfztR$1|}?%{a~EO(IEdD{4_IqR|N58V9xhb69F&uK2iB|T~Va?@1R zOSPsO_Gdm8ujRRb8RGoHyz%0c@_)su^CeobrPKRWI$>sTXtk3q!s$lUm)ak5`j@$( zaSQQ7el3~PqN&=Yq=AeunyzjXqOLYSOV delta 1884 zcmb7^eN0OY;iyl`KFgrq|lD>H3lIhU}98~$u=Yq7Xr!x ziqVYikY&?|NX!h2A7~e2^bg2F!mwPaA1Dw~0nIbz0d*2kcQo zb93vn$D3t!L?0&>({~mdU9k0gf7Z4I1=q=Yjz7`bPNRA!eQ4N0$<~xj+DhtPdRj={ zq(3aSQ|H=ZTr5qA3)_etr_LmcUwppbIKt}=y`t|;f8dJ*00Y^;Y%ZY72hJ4%3x&Xl z2bgwqg=+x|J7<}Z4g;6j6-^bu$%8J8%76 z>lYkB!@7Nb+J7ZbiaxHDYw3nHk%l4ep9AIOq;cJirJwgs0rkj&;s=)PPpuH9MtimT7XR5S|>nRUMSt3{G% z_$+lbkLQAU?k!CU>-ECRLihDv) zk-LN@oRX07Ztucvo)Eor&KQk3Jy-3DmKN?V>+8Ui1Mjac&sa5Jmj#k7WNXEWEbSC~ zjLs`BaOR!7Zr0jHk>y6}k<+QnCFxVgI=<$c!Y<|Qyq1H@0Cl! zVhMfEHx1zw=6*@|)N*lNxkpBN+dU}W&U^s_)m9^{iwrRX^>MwHA z50#Q(YWn$WeY{Vl3p}_GZtAM4H~b}!UgrkHm)-A(>CbAT*e!hi;~T8UvaSgqWW7NsC|;TEXDyD_Yv%ONwFLj7*vh2T>cy<1wB+Ce T|E+XJahI8w$@|_RPo41}C>i*c diff --git a/DLLUsageDemo/LibEasyOCR-CPPd.lib b/DLLUsageDemo/LibEasyOCR-CPPd.lib index 4a198d3570ffdbd02fc474e89cb221213194af8b..cccd6220321ca16df567a85d185201c2364cd473 100644 GIT binary patch delta 2031 zcmb`HYfPJE6vzL)Kre5h?fP;Z&@w?NB;&G*3H;~kf|r5cqi8lwTD5kWNB(2$84iOI;oB^U?}&)XNbk@-PoO@4je_ngyn zPM_z0o-c!C3_#r!&~QnDY80(xQKkk3GqEoio`3((&VAaD5nG@tq|ZPR6~i}@c( zhUmIJZ6itSv?8qU^gniyLF%L=n$O5$^uhLsMU@x zninvY0yF&F?Ey~l^I|P|NoTX+vzI65SyFuTYEVw5mH(N6 zG_GdDqsRItSVw&RA%~r#%W29b8tBI29E+Akzz(xAE#x@u6Ahzpb$xS$9U93oX6m5y zM!%rQdwujHHfp)1(f9@}l{5#R-@^JbuJbye5(jH_LP+^rw^`2~+t`vp0$?+r4k~B7SGP;<3&B94*;TO-c&B(Te zm;;>1uj~IleS(J*COY6IU5oMZuP%NwQ-tTZZnqG;%7ctebjI_%?x|-!{rv@gvrty` zMA)9W;iW#xtaj6Ud=3R_s%;NsZ@+6VYHtJIm)3S9PM0uxIwlF^-DiUHCSxi~K%mJ9Ftwy(My>>+td}_Qi4r zr*Cje0-cWwqgNf#^paPkx~g0%^jd^>9{XXA?<&4r)Z|JlVxQm8J)rvfG~42(+BY4~ zv9X*+8!Q5nfBv(V9h*7$Li|B4=huz2FU=fbTLOLJ8;yM0*>qVFVWL#@A-Z6Gn8qVr Il+_gV7t*CP{{R30 delta 1756 zcma)+eN0Pi^((lCS!aBs3Oo7%nffUOmznc1&Z7v+7qnL^)M){k+6skW4>Mb|Zq}KWm%|wpm;yCR>a%tRna!Wp4+HjigZYw6E zsEwQZ@7M_4&}~c**Op+uDC$r7$Pl*w)$9W9_E04-Qw5}N2Nr68hzlrc=6e7zxPkNh z?Dqo0{5irNbaBqUYQWeCj5CgK z11D_aU~YkqKXS5_leewf4(pKv4YH91BU14IGLVjS5Mh7?xiBLSS_sg=giPp>f_zwE zLox~=Aq^@dtsz71|D+(RWlZTc)k}rs$}>_#%BM+{j^0TriTd&mB_&+rOZiLjLA~W` zHAF-eq*#6-`Gel*(;N4xxfC`Z9b7F%Pu(TDsG&ryPEbNgG;eEhe30VPf;D>Wbo8b2 zbRA_nq*Q5x``c1>NfNh3*$Y|ZcZ7rweqZ{|!@8QzIF1RoZ|?qy?EwvsHqmp=r^MKV zWuDE!E!2=L??Dn=9b)^TfjKq9M?*hU6R;2(m2EB<2GvOlxhzGhGNkoTcY8?u)W3K7EQoF^o14vj3n$jMXqoj}$; zvNU!GBkyNkf0Q)?g&R+Z&z?Os%dTeoYABZJpq)(}!Yy;@wE@0uLx7F%Tv6kkU^8)Bf?7m#E(Nfk|@v;6W&zMO&{Zt ziANsV@9WF4S5zv;_uu~9K)>Y{k+U`a%#f|mU-ACu z?W&>Ia%yNc5YpfEd@}b2Yq|2e^gr|}iyjh!8RD$w>+6F&Vdmgp);~|9!H{s^5AB7+ atXXI|cu{me{{4#Viad^}Egqvqhv`q-GvA~D diff --git a/EasyOCR-CPP/EasyOCR-CPP.cpp b/EasyOCR-CPP/EasyOCR-CPP.cpp index 9bdbd1f..836b0a6 100644 --- a/EasyOCR-CPP/EasyOCR-CPP.cpp +++ b/EasyOCR-CPP/EasyOCR-CPP.cpp @@ -45,16 +45,19 @@ int main() cv::blur(image, image, { 3,3 }); //WarmUP GPU - for (int i = 0; i < 10; i++) + if (uns::G_OCRConfig.GetGPUUsage() != uns::OCRConfig::GPUUsage::CPUOnly) { - std::cout << "Warming UP GPU (" << i << ") ......" << std::endl; - clock_t start = clock(); - auto rects = detector(image); - auto results = recognizer(image, rects); - clock_t end = clock(); - std::cout << "Warm UP [" << i << "] Cost " << static_cast(end - start) / static_cast(CLOCKS_PER_SEC) << " Second(s)" << std::endl; + for (int i = 0; i < 10; i++) + { + std::cout << "Warming UP GPU (" << i << ") ......" << std::endl; + clock_t start = clock(); + auto rects = detector(image); + auto results = recognizer(image, rects); + clock_t end = clock(); + std::cout << "Warm UP [" << i << "] Cost " << static_cast(end - start) / static_cast(CLOCKS_PER_SEC) << " Second(s)" << std::endl; + } + std::cout << "GPU Warm UP Finished" << std::endl; } - std::cout << "GPU Warm UP Finished" << std::endl; //Begin OCR clock_t start = clock(); @@ -64,8 +67,8 @@ int main() clock_t recognize_finished = clock(); for (const auto& [index, info] : results) { - const auto& [text, conf] = info; - std::cout << "Box " << index << ": \"" << WtoA(text) << "\" Confidence=" << conf << "\n"; + const auto& [text, conf, rect] = info; + printf("Result %d: Text = {%s}, Box = [%d, %d, %d, %d], Confidence = %.3f\n", (int)index, WtoA(text).c_str(), rect.tl().x, rect.tl().y, rect.br().x, rect.br().y, conf); } //Output Time Cost diff --git a/EasyOCR-CPP/EasyOCR_Recognizer.cpp b/EasyOCR-CPP/EasyOCR_Recognizer.cpp index 7829a24..8579806 100644 --- a/EasyOCR-CPP/EasyOCR_Recognizer.cpp +++ b/EasyOCR-CPP/EasyOCR_Recognizer.cpp @@ -377,7 +377,7 @@ uns::EOCR_ResultSet uns::EasyOCR_Recognizer::operator()(const cv::Mat& full_imag if (crop.empty()) continue; auto [text, conf] = (*this)(crop); - result_set.insert({ i, { text, conf } }); + result_set.insert({ i, { text, conf, rect } }); } return result_set; } diff --git a/EasyOCR-CPP/OCRToolBox.h b/EasyOCR-CPP/OCRToolBox.h index d846422..1b764b2 100644 --- a/EasyOCR-CPP/OCRToolBox.h +++ b/EasyOCR-CPP/OCRToolBox.h @@ -11,8 +11,9 @@ namespace uns using VecFloat = std::vector; using IONames = std::vector; using IONamesStorage = std::vector; - using EOCR_Result = std::pair; - using EOCR_ResultSet = std::map; + using EOCR_Result = std::tuple; + using EOCR_Result_Single = std::tuple; + using EOCR_ResultSet = std::map; using EOCRD_Rects = std::vector>; class OCRToolBox diff --git a/LibEasyOCR-CPP/EasyOCR_Recognizer.cpp b/LibEasyOCR-CPP/EasyOCR_Recognizer.cpp index 2477d13..58fafac 100644 --- a/LibEasyOCR-CPP/EasyOCR_Recognizer.cpp +++ b/LibEasyOCR-CPP/EasyOCR_Recognizer.cpp @@ -378,7 +378,7 @@ uns::EOCR_ResultSet uns::EasyOCR_Recognizer::operator()(const cv::Mat& full_imag if (crop.empty()) continue; auto [text, conf] = (*this)(crop); - result_set.insert({ i, { text, conf } }); + result_set.insert({ i, { text, conf, rect } }); } return result_set; } diff --git a/LibEasyOCR-CPP/LibEasyOCR-CPP.h b/LibEasyOCR-CPP/LibEasyOCR-CPP.h index 3d283ad..871072c 100644 --- a/LibEasyOCR-CPP/LibEasyOCR-CPP.h +++ b/LibEasyOCR-CPP/LibEasyOCR-CPP.h @@ -10,8 +10,9 @@ namespace uns { namespace easyocr { - using EOCR_Result = std::pair; - using EOCR_ResultSet = std::map; + using EOCR_Result = std::tuple; + using EOCR_Result_Single = std::tuple; + using EOCR_ResultSet = std::map; using EOCRD_Rects = std::vector>; } diff --git a/LibEasyOCR-CPP/OCRConfig.cpp b/LibEasyOCR-CPP/OCRConfig.cpp index b2c4f05..7cf4061 100644 --- a/LibEasyOCR-CPP/OCRConfig.cpp +++ b/LibEasyOCR-CPP/OCRConfig.cpp @@ -3,6 +3,9 @@ uns::OCRConfig uns::G_OCRConfig; +std::wstring detect_model_path; +std::wstring recognize_model_path; + uns::OCRConfig::OCRConfig() { language = easyocr::CharsetType::EN; diff --git a/LibEasyOCR-CPP/OCRConfig.h b/LibEasyOCR-CPP/OCRConfig.h index fb9b46a..7e348b1 100644 --- a/LibEasyOCR-CPP/OCRConfig.h +++ b/LibEasyOCR-CPP/OCRConfig.h @@ -25,8 +25,6 @@ namespace uns private: easyocr::GPUUsage gpu_usage; easyocr::CharsetType language; - std::wstring detect_model_path; - std::wstring recognize_model_path; public: OCRConfig(); diff --git a/LibEasyOCR-CPP/OCRToolBox.h b/LibEasyOCR-CPP/OCRToolBox.h index d846422..1b764b2 100644 --- a/LibEasyOCR-CPP/OCRToolBox.h +++ b/LibEasyOCR-CPP/OCRToolBox.h @@ -11,8 +11,9 @@ namespace uns using VecFloat = std::vector; using IONames = std::vector; using IONamesStorage = std::vector; - using EOCR_Result = std::pair; - using EOCR_ResultSet = std::map; + using EOCR_Result = std::tuple; + using EOCR_Result_Single = std::tuple; + using EOCR_ResultSet = std::map; using EOCRD_Rects = std::vector>; class OCRToolBox