目录

问题描述:

目的:

前提:

配置环境的过程记录:

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。

配置环境的过程记录:

1. 下载安装cmake、opencv

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也解压到相同的目录:

opencv freetype puttext opencv freetype puttext后为空_配置项


 

opencv freetype puttext opencv freetype puttext后为空_计算机视觉_02

 

opencv freetype puttext opencv freetype puttext后为空_qt_03

2. 编译freetype和harfbuzz

这一步主要解决在图片中显示中文汉字乱码的问题。

下载pkg-config: https://sourceforge.net/projects/pkgconfiglite/ 下载freetype: FreeType-2.12.1 (linuxfromscratch.org) 下载harfbuzz:HarfBuzz-5.3.1 (linuxfromscratch.org)

编译顺序:先编译freetype,再编译harfbuzz,再编译freetype

2.1 pkg-config

解压后添加bin目录到系统PATH环境变量(例如:D:\Program Files\pkg-config-lite-0.28-1\bin)

2.2 freetype

将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”按钮,弹出选项框:

opencv freetype puttext opencv freetype puttext后为空_opencv_04

编译器的选项内容如下: 

C:C:/Qt/Tools/mingw810_64/bin/gcc.exe

C++:C:/Qt/Tools/mingw810_64/bin/g++.exe

配置如下编译选项:

opencv freetype puttext opencv freetype puttext后为空_qt_05

然后点击“Configure”按钮,再点击“Generate”按钮。

opencv freetype puttext opencv freetype puttext后为空_Qt_06

进入到 D:\DevTools\freetype-2.12.1\freetype_build文件夹下,按下“shift”+右键点击,选择“在此处打开Powershell窗口”:

opencv freetype puttext opencv freetype puttext后为空_计算机视觉_07

然后输入: mingw32-make -j4进行编译(其中数字4表示处理器的个数,可以写1、2等,根据电脑情况来填写);

再输入:mingw32-make install 进行安装,安装成功后会在freetype_install文件夹中产生include头文件以及lib文件。

opencv freetype puttext opencv freetype puttext后为空_opencv_08

 然后添加环境变量:FREETYPE_DIR

opencv freetype puttext opencv freetype puttext后为空_配置项_09

2.3 harfbuzz

将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(勾选):

opencv freetype puttext opencv freetype puttext后为空_qt_10

 再次点击 “Configure”按钮,再点击“Generate”按钮。

 

opencv freetype puttext opencv freetype puttext后为空_Qt_11

 进入到 D:\DevTools\harfbuzz-5.3.1\harfbuzz_build文件夹下,按下“shift”+右键点击,选择“在此处打开Powershell窗口”:

然后输入: mingw32-make -j4进行编译;可能会报如下错误:

opencv freetype puttext opencv freetype puttext后为空_计算机视觉_12

修正cmake的配置项,再重新“Configure”,“Generate”,再编译,错误解决。

 CMAKE_CXX_FLAGS: -Ofast -flto -BigObj

再输入:mingw32-make install 进行安装。

设置环境变量:HARFBUZZ_DIR:D:\DevTools\harfbuzz-5.3.1\harfbuzz_install

2.4 reinstall  freetype

修正cmake配置项:修正harfbuzz相关路径,以及增加BUILD_SHARED_LIBS(勾选):

opencv freetype puttext opencv freetype puttext后为空_计算机视觉_13

 点击“Configure”,“Generate”,然后输入: mingw32-make -j4进行编译;再输入:mingw32-make install 进行安装。

3. 编译opencv+opencv_contrib

3.1 修改opencv_contrib下的modules/freetype/CMakeLists.txt

改为如下:

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()

3.2 cmake-gui,选择MinGW编译:

where is the source code框:C:/opencv/sources

where to build the binaries框:C:/opencv/opencv_build

3.2.1 点击“Configure” 按钮,第一次时间有些久,可能会出现如下错误:

opencv freetype puttext opencv freetype puttext后为空_配置项_14


 1)从其他地方下载文件(下载出处见上面链接中),放在opencv\sources.cache\ffmpeg目录中:

opencv freetype puttext opencv freetype puttext后为空_opencv_15

 注意:文件名中需要增加“videoio_”

 2)修正C:\opencv\sources\3rdparty\ffmpeg\ffmpeg.cmake文件中的MD5值:

opencv freetype puttext opencv freetype puttext后为空_配置项_16

 再次点击“Configure” 按钮,结果正常。

3.2.2 修正配置项OPENCV_EXTRA_MODULES_PATH等:

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" 

 修改如下配置项:

opencv freetype puttext opencv freetype puttext后为空_opencv_17

 2)无法下载xfeatures2d:

CMake Warning at cmake/OpenCVDownload.cmake:248 (message):
 xfeatures2d/boostdesc: Download failed: 6;"Couldn't resolve host name"

参照ffmpeg的方式,从其他地方下载,并修改MD5值,详细参见:


将下载的文件拷贝到: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中 

3.2.3 修改freetype、harfbuzz相关路径的配置项:

opencv freetype puttext opencv freetype puttext后为空_计算机视觉_18

 点击“Configure”,“Generate”,然后在C:\opencv\opencv_build路径中进入Powershell窗口,输入: mingw32-make -j4进行编译;再输入:mingw32-make install 进行安装。

 4 qt 实例

4.1 配置

新建一个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工程中 。这个操作为了解决,运行代码后会弹出如下的错误:

opencv freetype puttext opencv freetype puttext后为空_配置项_19

opencv freetype puttext opencv freetype puttext后为空_Qt_20

4.2 main.cpp文件代码:

//#include <QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/freetype.hpp>

int main(int argc, char *argv[])
{
    //QCoreApplication a(argc, argv);
    cv::Mat img = cv::imread("1.jpg");
    cv::namedWindow("imgShow");

    cv::Ptr<cv::freetype::FreeType2> 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();
}

4.3 运行效果:

opencv freetype puttext opencv freetype puttext后为空_opencv_21