Qt利用VCPKG和CMake和OpenCV和Tesseract實(shí)現(xiàn)中英文OCR
??今天看 OpenCV 方面的教程,pdf 格式的,因?yàn)橐恍?qiáng)迫癥的習(xí)慣,喜歡添加一些書(shū)簽,手動(dòng)是不太愿意的,自然就想到利用OCR來(lái)實(shí)現(xiàn)。
??想要自己編碼實(shí)現(xiàn)OCR,方案比較簡(jiǎn)單就是 Tesseract 。單獨(dú)使用 Tesseract 也可以,但最好利用 OpenCV 來(lái)進(jìn)行圖像方面的處理,一大堆方法可以濾波,變換,就是不停地調(diào)參數(shù)讓人心煩,不同的圖,需要使用不同的方法,也不清爽。出于總結(jié)的需要,把過(guò)程記錄下。
??這個(gè)項(xiàng)目就是個(gè)Demo,比較簡(jiǎn)單,網(wǎng)上的水貨,只有 Qt Creator 和 CMake 和 vcpkg 的配合使用 ,有點(diǎn)參考價(jià)值。
1. 開(kāi)發(fā)平臺(tái)
- os : win10 x64
- Qt:6.6
- compiler:msvc2022
- 項(xiàng)目管理:cmake
- 包管理: vcpkg
- 開(kāi)發(fā)庫(kù)版本:
- OpenCV : 4.8 ,這個(gè)很友好,有編譯出來(lái)的庫(kù),不需要自己去弄
- Tesseract-ocr : 5.3 巨坑,二進(jìn)制文件為啥不包含lib ? ??
2. 下載文件
-
先說(shuō)說(shuō)踩過(guò)的坑,希望有相關(guān)經(jīng)驗(yàn)的大佬,給點(diǎn)指點(diǎn)吧。
-
Tesseract 的坑
在 Tesseract 的 https://github.com/tesseract-ocr/tesseract#installing-tesseract,有二進(jìn)制包,興沖沖地下載后,一看原來(lái)不是庫(kù)文件,是可執(zhí)行文件,這如何編碼,用進(jìn)程對(duì)話(huà)來(lái)實(shí)現(xiàn)?這包何用,對(duì)開(kāi)發(fā)無(wú)益
tesseract-ocr-w64-setup-5.3.3.20231005.exe (64 bit) 安裝后 沒(méi)有l(wèi)ib庫(kù),只有可執(zhí)行文件
-
sw 坑
既然沒(méi)有 Tesseract 現(xiàn)成的庫(kù),那就需要自己編譯了,在Tesseract 上接觸到了 sw,這也是一個(gè)包管理方面的東西,關(guān)鍵是會(huì)自動(dòng)下載,自動(dòng)解決包依賴(lài)的問(wèn)題,看上去很方便,興沖沖地下載使用,發(fā)現(xiàn)網(wǎng)速也是剛剛的,cmake 也能使用,看看文檔 下載、添加環(huán)境變量、在cmake設(shè)置依賴(lài)的包,然后等待成功吧。
find_package(SW REQUIRED) sw_add_package( org.sw.demo.glennrp.png ) sw_execute() add_executable(mytarget ${MY_SOURCES}) target_link_libraries(mytarget org.sw.demo.glennrp.png )
看上去很美好,但是 sw_execute() 這一步時(shí)間長(zhǎng)的也是讓人醉了,只要CMakeFiles.txt 一有變動(dòng),這玩意就會(huì)折騰好一陣子。
有大佬會(huì)的么,指點(diǎn)一下細(xì)節(jié)。這東西看上去不錯(cuò),值得鼓掌和期待。希望好起來(lái)吧。
還有個(gè)swgui的客戶(hù)端,也是折騰了一下,但是最后也沒(méi)掌握,也搞不懂。遂棄之。
-
2.1 下載安裝 OpenCV 庫(kù)
??這一步很簡(jiǎn)單,官網(wǎng)有很多版本的,我就找了一個(gè)最新的
??Releases - OpenCV
下載安裝,添加環(huán)境變量就行。就可以省略向生成的目錄下 復(fù)制 dll 的步驟。
2.2 下載安裝 Tesseract-OCR庫(kù)
??踩過(guò)了SW的坑,還是回到了VCPKG。利用 IDM 和 迅雷 實(shí)現(xiàn)手動(dòng)加速網(wǎng)絡(luò)。過(guò)程比較繁瑣,但是沒(méi)啥難度。另外使用PowerShell 會(huì)方便一點(diǎn)。
vcpkg install tesseract --triplet=x64-windows
具體步驟:
- 執(zhí)行
vcpkg install tesseract --triplet=x64-windows
- ctrl + c 中斷
- 復(fù)制下載鏈接,手動(dòng) IDM 或者 迅雷
- 重命名
- 繼續(xù) 執(zhí)行
vcpkg install tesseract --triplet=x64-windows
…
慢慢征途,應(yīng)該有本小說(shuō)在伴。祝網(wǎng)速好運(yùn)。
另外不要自己去手動(dòng)編譯 Tesseract 庫(kù),這庫(kù)依賴(lài)也多,依賴(lài) leptonica 、archive.dll、bz2.dll、clang_rt.asan_dynamic-x86_64.dll、gif.dll、jpeg62.dll、libcrypto-3-x64.dll、libcurl.dll、liblzma.dll、libpng16.dll、libsharpyuv.dll、libwebp.dll、libwebpmux.dll、lz4.dll、openjp2.dll、tiff.dll、zlib1.dll、zstd.dll,煩透啦。
2.3 下載訓(xùn)練好的語(yǔ)言包
-
tessdata_best: https://github.com/tesseract-ocr
-
eng.traineddata 和 chi_sim.traineddata
-
點(diǎn)擊進(jìn)去下載raw
3. CMakeLists.txt 內(nèi)容
cmake_minimum_required(VERSION 3.24)
project(36_Opencv4_Tesseract_OCR LANGUAGES CXX)
#set(CMAKE_CXX_STANDARD 17)
#set(CMAKE_CXX_STANDARD_REQUIRED ON)
##################### 設(shè)置 QT庫(kù) #####################
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
# 添加自定義代碼的 include 和 source 路徑
#include_directories (D:/Project/qt_common_tools/global_define)
#aux_source_directory (D:/Project/qt_common_tools/global_define COMMON_TOOLS_LIST)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core )
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core )
##################### vcpkg 庫(kù) #####################
#尋找 TESSERACT 庫(kù)
FIND_PACKAGE(tesseract REQUIRED)
#尋找 LEPTONICA 庫(kù)
FIND_PACKAGE(leptonica REQUIRED)
##################### opencv 庫(kù) #####################
set(OpenCV_DIR C:/OpenCV/opencv/build)
#尋找OpenCV庫(kù)
FIND_PACKAGE(OpenCV REQUIRED)
##打印調(diào)試信息
#MESSAGE(STATUS "Project: ${PROJECT_NAME}")
#MESSAGE(STATUS "OpenCV library status:")
#MESSAGE(STATUS " version: ${OpenCV_VERSION}")
#MESSAGE(STATUS " libraries: ${OpenCV_LIBS}")
#MESSAGE(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
##################### 修改入口點(diǎn) #####################
# 設(shè)置程序?yàn)?windows 程序 修改入口點(diǎn),不顯示 console
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:mainCRTStartup")
#################### 內(nèi)存泄露檢查 #####################
#SET(CMAKE_CXX_FLAGS "-fsanitize=address")
#獲取代碼,在項(xiàng)目中,將所有代碼都放在src文件夾中
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
#MESSAGE(STATUS "Src file: ${DIR_SRCS}")
#################### 設(shè)置源碼編碼 ####################
#add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/source-charset:utf-8>")
#add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/execution-charset:GBK>")
#{{{{{{{{{{{{{{{{{{{ 編譯可執(zhí)行程序 }}}}}}}}}}}}}}}}}}}}#
add_executable( ${PROJECT_NAME}
# WIN32
${DIR_SRCS}
${COMMON_TOOLS_LIST}
)
#################### 添加鏈接庫(kù) #####################
set(VCPKG_INCLUDE_DIR C:/vcpkg/installed/x64-windows/include)
set(VCPKG_LIB_DIR C:/vcpkg/installed/x64-windows/lib)
# 頭文件路徑
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PUBLIC ${VCPKG_INCLUDE_DIR})
# lib文件路徑
TARGET_LINK_DIRECTORIES(${PROJECT_NAME}
PUBLIC
${VCPKG_LIB_DIR})
# lib文件
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC
${OpenCV_LIBS}
tesseract53
leptonica
Qt${QT_VERSION_MAJOR}::Core
)
# 設(shè)置默認(rèn)打開(kāi)VCPKG
#set_target_properties(${PROJECT_NAME} PROPERTIES VS_GLOBAL_VcpkgEnabled true)
#################### 設(shè)置app ico #####################
##set(app_icon_resource_windows ${CMAKE_CURRENT_SOURCE_DIR}/logo.rc)
##message(STATUS "${app_icon_resource_windows}")
4. Main.cpp
//#include "chinese.h"
#include "qdebug.h"
#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <tesseract/baseapi.h> // tesseract main header
#include <QBuffer>
using namespace cv;
int main()
{
std::string image_name = "txt.jpg";
Mat imageMat;
imageMat = imread(image_name);
// imshow(ANSI("原圖"), imageMat);
imshow("origin", imageMat);
if (imageMat.empty()) {
printf("No image data \n");
return -1;
}
// Rect ccomp;
// floodFill(imageMat,Point(3,3),Scalar(255,255,255),&ccomp,Scalar(10,10,10),Scalar(20,20,20));
cv::cvtColor(imageMat, imageMat, cv::COLOR_BGR2GRAY);
char *outText;
tesseract::TessBaseAPI tessbaseApi;
if (tessbaseApi.Init("./", "chi_sim+eng")) { // chi_sim+eng 把下載的語(yǔ)言包 和 可執(zhí)行文件放到一起
std::cout << stderr << std::endl;
exit(1);
}
// tesseract 設(shè)置圖片
tessbaseApi.SetImage((uchar *) imageMat.data, imageMat.cols, imageMat.rows, 1, imageMat.cols);
// 獲取 ocr 結(jié)果
outText = tessbaseApi.GetUTF8Text();
if (outText == nullptr) {
std::cout << "沒(méi)有數(shù)據(jù)" << std::endl;
}
QBuffer buf;
buf.setData(outText);
buf.open(QIODevice::ReadOnly);
while (!buf.atEnd()) {
QString line = buf.readLine();
// line = removedSpaceInterChinese(line); // 自定義的函數(shù) , 移除中文之間的空格 可以不考慮
if (!line.trimmed().isEmpty())
qDebug() << line;
}
delete[] outText;
waitKey();
return 0;
}
4.1 中英文混合OCR
tessbaseApi.Init("./", "chi_sim+eng")
使用 + 號(hào) 連接 chi_sim、eng 就行
5. 在Qt Creator 中設(shè)置 CMake + vcpkg
cmake導(dǎo)入庫(kù): 可以手動(dòng)編寫(xiě) ,但既然能夠偷懶,為啥要?jiǎng)邮?O(∩_∩)O
但是第一步還得手動(dòng):
5.1 在初始化配置文件里修改
如果切換編譯模式 realease —> debug 也得手動(dòng)添加 /(ㄒoㄒ)/~~
5.2 在構(gòu)建配置里修改
剛剛又搗鼓出來(lái)了一個(gè),直接在 工具配置里 添加 -DCMAKE_TOOLCHAIN_FILE:STRING=C:/vcpkg/scripts/buildsystems/vcpkg.cmake
就行
推薦指數(shù):?????
說(shuō)明:在Qt工程中CMake使用vcpkg安裝的庫(kù)
# 在Qt工程中使用vcpkg安裝的庫(kù),改成自己的vcpkg安裝目錄 1. qt 在項(xiàng)目中添加 CMAKE_TOOLCHAIN_FILE C:/vcpkg/scripts/buildsystems/vcpkg.cmake 2. CMakeList.txt ##################### vcpkg 庫(kù) ##################### #尋找 TESSERACT 庫(kù) FIND_PACKAGE(tesseract REQUIRED) #尋找 LEPTONICA 庫(kù) FIND_PACKAGE(leptonica REQUIRED) #################### 鏈接庫(kù) ##################### set(VCPKG_INCLUDE_DIR C:/vcpkg/installed/x64-windows/include) // 這一步其實(shí)也可以修改,不用絕對(duì)路徑 set(VCPKG_LIB_DIR C:/vcpkg/installed/x64-windows/lib) # 頭文件路徑 TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PUBLIC ${VCPKG_INCLUDE_DIR}) # lib文件路徑 TARGET_LINK_DIRECTORIES(${PROJECT_NAME} PUBLIC ${VCPKG_LIB_DIR}) # lib文件 TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC tesseract53 leptonica )
6. 效果截圖
7. 小結(jié)
構(gòu)建套件:Desktop Qt 6.6 MSVC2019 64bit 可以使用 MSVC2022 版的c 和 c++的編譯器,也算方便。如果msvc添加了142生成工具,那也可以手動(dòng)添加編譯,選擇 msvc2019模式就行。
如果沒(méi)有使用Qt的模塊【就這個(gè)程序而言,完全可以不用qt】,用std::cout 輸出,會(huì)發(fā)現(xiàn) QC的應(yīng)用程序輸出框全是亂碼,但是不要慌!
用cmd去執(zhí)行程序,代碼頁(yè)切換到utf-8 : chcp 65001文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-742842.html
想說(shuō)的也說(shuō)完了,大功告成!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-742842.html
到了這里,關(guān)于Qt利用VCPKG和CMake和OpenCV和Tesseract實(shí)現(xiàn)中英文OCR的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!