目录
问题描述:
目的:
前提:
配置环境的过程记录:
1. 下载安装cmake、opencv
2. 编译freetype和harfbuzz
2.1 pkg-config
2.2 freetype
2.3 harfbuzz
2.4 reinstall freetype
3. 编译opencv+opencv_contrib
3.1 修改opencv_contrib下的modules/freetype/CMakeLists.txt
3.2 cmake-gui,选择MinGW编译:
3.2.1 点击“Configure” 按钮,第一次时间有些久,可能会出现如下错误:
3.2.2 修正配置项OPENCV_EXTRA_MODULES_PATH等:
3.2.3 修改freetype、harfbuzz相关路径的配置项:
4 qt 实例
4.1 配置
4.2 main.cpp文件代码:
4.3 运行效果:
5 参考链接:
Windows10下在qt+opencv中在图片上叠加中文汉字时,发现putText输出为乱码,网上查询各种资料后,发现需要安装freetype才行。opencv_contrib里包含了freetype,但是在windows下仅仅通过设置OPENCV_EXTRA_MODULES_PATH,无法编译出libopencv_freetype*.dll,具体原因不清楚。
记录配置环境的详细过程,防止后续遗忘,以及能给遇到相同问题的朋友提供一些提示信息。
win10系统中已安装了Qt。
cmake下载地址:https://cmake.org/download/
opencv下载地址:https://opencv.org/releases/
opencv_contrib下载地址:https://github.com/opencv/opencv_contrib
其中,opencv_contrib的版本要与opencv的版本一致。
本文编写时,最新版本为opencv4.6.0、opencv_contrib4.x
双击下载的opencv的exe文件,执行的是解压操作,选择一个目录解压即可,然后把opencv_contrib也解压到相同的目录:
这一步主要解决在图片中显示中文汉字乱码的问题。
下载pkg-config: https://sourceforge.net/projects/pkgconfiglite/
下载freetype: FreeType-2.12.1 (linuxfromscratch.org)
下载harfbuzz:HarfBuzz-5.3.1 (linuxfromscratch.org)
编译顺序:先编译freetype,再编译harfbuzz,再编译freetype
解压后添加bin目录到系统PATH环境变量(例如:D:\Program Files\pkg-config-lite-0.28-1\bin)
将freetype解压到D盘,并在freetype-2.12.1中新建freetype_build和freetype_install两个文件夹,运行cmake-gui进行配置。
where is the source code框:D:/DevTools/freetype-2.12.1
where to build the binaries框:D:/DevTools/freetype-2.12.1/freetype_build
第一次点击“Configure”按钮,弹出选项框:
编译器的选项内容如下:
C:C:/Qt/Tools/mingw810_64/bin/gcc.exe
C++:C:/Qt/Tools/mingw810_64/bin/g++.exe
配置如下编译选项:
然后点击“Configure”按钮,再点击“Generate”按钮。
进入到 D:\DevTools\freetype-2.12.1\freetype_build文件夹下,按下“shift”+右键点击,选择“在此处打开Powershell窗口”:
然后输入: mingw32-make -j4进行编译(其中数字4表示处理器的个数,可以写1、2等,根据电脑情况来填写);
再输入:mingw32-make install 进行安装,安装成功后会在freetype_install文件夹中产生include头文件以及lib文件。
然后添加环境变量:FREETYPE_DIR
将harfbuzz解压到D盘,并在harfbuzz-5.3.1中新建harfbuzz_build和harfbuzz_install两个文件夹,运行cmake-gui进行配置。
where is the source code框:D:/DevTools/harfbuzz-5.3.1
where to build the binaries框:D:\DevTools\harfbuzz-5.3.1\harfbuzz_build
第一次点击“Configure”按钮,弹出选项框:选择MinGW,然后修正配置项:
CMAKE_INSTALL_PREFIX:D:/DevTools/harfbuzz-5.3.1/harfbuzz_install
HB_HAVE_FREETYPE:勾选
再次点击 “Configure”按钮,然后再修正配置项:修正freetype相关路径,以及增加BUILD_SHARED_LIBS(勾选):
再次点击 “Configure”按钮,再点击“Generate”按钮。
进入到 D:\DevTools\harfbuzz-5.3.1\harfbuzz_build文件夹下,按下“shift”+右键点击,选择“在此处打开Powershell窗口”:
然后输入: mingw32-make -j4进行编译;可能会报如下错误:
修正cmake的配置项,再重新“Configure”,“Generate”,再编译,错误解决。
CMAKE_CXX_FLAGS: -Ofast -flto -BigObj
再输入:mingw32-make install 进行安装。
设置环境变量:HARFBUZZ_DIR:D:\DevTools\harfbuzz-5.3.1\harfbuzz_install
修正cmake配置项:修正harfbuzz相关路径,以及增加BUILD_SHARED_LIBS(勾选):
点击“Configure”,“Generate”,然后输入: mingw32-make -j4进行编译;再输入:mingw32-make install 进行安装。
改为如下:
set(the_description "FreeType module. It enables to draw strings with outlines and mono-bitmaps/gray-bitmaps.")
find_package(Freetype REQUIRED)
# find_package(HarfBuzz) is not included in cmake
set(HARFBUZZ_DIR "$ENV{HARFBUZZ_DIR}" CACHE PATH "HarfBuzz directory")
find_path(HARFBUZZ_INCLUDE_DIRS
NAMES hb-ft.h PATH_SUFFIXES harfbuzz
HINTS ${HARFBUZZ_DIR}/include)
find_library(HARFBUZZ_LIBRARIES
NAMES harfbuzz
HINTS ${HARFBUZZ_DIR}/lib)
find_package_handle_standard_args(HARFBUZZ
DEFAULT_MSG HARFBUZZ_LIBRARIES HARFBUZZ_INCLUDE_DIRS)
if(NOT FREETYPE_FOUND)
message(STATUS "freetype2: NO")
else()
message(STATUS "freetype2: YES")
endif()
if(NOT HARFBUZZ_FOUND)
message(STATUS "harfbuzz: NO")
else()
message(STATUS "harfbuzz: YES")
endif()
if(FREETYPE_FOUND AND HARFBUZZ_FOUND)
ocv_define_module(freetype opencv_core opencv_imgproc PRIVATE_REQUIRED ${FREETYPE_LIBRARIES} ${HARFBUZZ_LIBRARIES} WRAP python)
ocv_include_directories(${FREETYPE_INCLUDE_DIRS} ${HARFBUZZ_INCLUDE_DIRS})
else()
ocv_module_disable(freetype)
endif()
where is the source code框:C:/opencv/sources
where to build the binaries框:C:/opencv/opencv_build
由于资源地址无法连接上导致了次错误,我这边根据这篇文章进行了处理:(27条消息) opencv_contrib扩展模块的安装(CMake编译器)及解决文件下载失败的问题(超详细)_专注&专心的博客-CSDN博客_cmake opencv_contrib
1)从其他地方下载文件(下载出处见上面链接中),放在opencv\sources.cache\ffmpeg目录中:
注意:文件名中需要增加“videoio_”
2)修正C:\opencv\sources\3rdparty\ffmpeg\ffmpeg.cmake文件中的MD5值:
再次点击“Configure” 按钮,结果正常。
OPENCV_EXTRA_MODULES_PATH:填入opencv-contrib的目录下的modules目录
OPENCV_ENABLE_NONFREE:勾选
WITH_TBB:勾选
WITH_QT:勾选
WITH_OPENGL:勾选WITH_FREETYPE:勾选,支持中文文字,但必须先编译freetype和harfbuzz
出现的错误可能如下:
1)无法下载wechat_qrcode
CMake Warning at cmake/OpenCVDownload.cmake:248 (message):
wechat_qrcode: Download failed: 6;"Couldn't resolve host name"
修改如下配置项:
2)无法下载xfeatures2d:
CMake Warning at cmake/OpenCVDownload.cmake:248 (message):
xfeatures2d/boostdesc: Download failed: 6;"Couldn't resolve host name"
参照ffmpeg的方式,从其他地方下载,并修改MD5值,详细参见:
(27条消息) opencv_contrib扩展模块的安装(CMake编译器)及解决文件下载失败的问题(超详细)_专注&专心的博客-CSDN博客_cmake opencv_contrib
将下载的文件拷贝到:C:\opencv\sources\.cache\xfeatures2d中
3)无法下载data:
CMake Warning at cmake/OpenCVDownload.cmake:248 (message):
data: Download failed: 6;"Couldn't resolve host name"
同上的处理方式。将下载的文件拷贝到:C:\opencv\sources\.cache\data中
点击“Configure”,“Generate”,然后在C:\opencv\opencv_build路径中进入Powershell窗口,输入: mingw32-make -j4进行编译;再输入:mingw32-make install 进行安装。
新建一个qt控制台工程,在pro文件中新增opencv的相关引用配置:
INCLUDEPATH += C:\opencv\opencv_build\install\include
LIBS += C:\opencv\opencv_build\lib\libopencv_*.a
另外将libharfbuzz.dll(D:\DevTools\harfbuzz-5.3.1\harfbuzz_install\bin)组件拷贝到Qt工程路径,然后右键Qt工程->"添加现有文件",将libharfbuzz.dll添加到Qt工程中 。这个操作为了解决,运行代码后会弹出如下的错误:
//#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
//QCoreApplication a(argc, argv);
cv::Mat img = cv::imread("1.jpg");
cv::namedWindow("imgShow");
cv::Ptr ft2;
ft2 = cv::freetype::createFreeType2();
ft2->loadFontData("C:/Windows/Fonts/simhei.ttf", 0);
cv::Point pt(100, 100);
ft2->putText(img, "Hello, 你好!", pt, 18, CV_RGB(255, 0, 0), cv::FILLED, cv::LINE_AA, true);
cv::imshow("imgShow", img);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
//return a.exec();
}
(1条消息) opencv_contrib扩展模块的安装(CMake编译器)及解决文件下载失败的问题(超详细)_专注&专心的博客-CSDN博客_cmake opencv_contrib