windows下编译OpenCV带opencv_contrib和freetype

目录

  • 1. 下载安装cmake、opencv
  • 2. 编译freetype和harfbuzz
      • 2.1 pkg-config
      • 2.2 freetype
      • 2.3 harfbuzz
      • 2.4 修改opencv_contrib下的modules/freetype/CMakeLists.txt
  • 3. 编译OpenCV
  • 5. 示例
  • 6. 编译好的OpenCV下载地址
  • 7. 参考文章

1. 下载安装cmake、opencv

cmake下载地址:https://cmake.org/download/
opencv下载地址:https://opencv.org/releases/
opencv_contrib下载地址:https://github.com/opencv/opencv_contrib/releases

由于国内访问GitHub不稳定,使用Github下载的源码编译会出现很多资源下载失败而导致编译失败的问题。所以可以使用国内的opencv镜像,地址为:
opencv : https://gitcode.net/opencv/opencv
opencv_contrib:https://gitcode.net/opencv/opencv_contrib
详细说明参考此文章:《下载不再卡顿,OpenCV中国镜像启用》

其中,opencv_contrib的版本要与opencv的版本一致
本文编写时,最新版本为opencv4.5.2,因此我下载的版本为opencv4.5.2和opencv_contrib4.5.2

双击下载的opencv的exe文件,执行的是解压操作,选择一个目录解压即可,然后把opencv_contrib也解压到相同的目录:
windows下编译OpenCV带opencv_contrib和freetype_第1张图片
opencv本身自带编译了visual studio 2015 和 visual studio 2017 版本的64位的库,在build目录中可以直接使用了。
但是如果要32位的库,或者需要SURF、SIFT等算法,就需要编译opencv_contrib库

2. 编译freetype和harfbuzz

若要使用putText在图片中添加中文汉字,则需要编译freetype和harfbuzz,若没有中文汉字的需求,则这个目录下的内容忽略,直接跳到目录 -> 3.编译Opencv

下载pkg-config: https://sourceforge.net/projects/pkgconfiglite/
下载freetype: https://download.savannah.gnu.org/releases/freetype/
下载harfbuzz: https://github.com/harfbuzz/harfbuzz

2.1 pkg-config

解压后添加bin目录到系统PATH环境变量

2.2 freetype

windows下编译OpenCV带opencv_contrib和freetype_第2张图片
再次Configure, 然后点击Generate, 完成后,点击 Open Project 按钮,打开VS,编译。
VS里ALL_BUILD, INSTALL. 会在构建文件夹的install目录下生成所需的include和lib

然后添加环境变量:FREETYPE_DIR
windows下编译OpenCV带opencv_contrib和freetype_第3张图片

2.3 harfbuzz

windows下编译OpenCV带opencv_contrib和freetype_第4张图片
设置好上面两项后,再次点击Configure按钮

windows下编译OpenCV带opencv_contrib和freetype_第5张图片
2021/04/30修改,上图中 FREETYPE_INCLUDE_DIR_ft2build 应填 D:/DevelopmentTools/freetype-2.10.0/install/include, 上图少了include目录

填上freetype的相关路径,再次Configure, 然后点击Generate, 完成后,点击 Open Project 按钮,打开VS,编译。
VS里ALL_BUILD, INSTALL. 会在构建文件夹的install目录下生成所需的include,和lib
编译的lib,debug和release的名字是一样的,可以先把Debug和Release都编译出来,先编译Debug版本的INSTALL,等opencv的Debug版本编译完了,再编译Release版本的INSTALL,然后编译Release版本的Opencv
编译完成后, 设置环境变量
windows下编译OpenCV带opencv_contrib和freetype_第6张图片

2.4 修改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. 编译OpenCV

windows下编译OpenCV带opencv_contrib和freetype_第7张图片
windows下编译OpenCV带opencv_contrib和freetype_第8张图片
点击finish后,开始configure,如果有很多爆红的地方,可以参考文章《opencv_contrib安装笔记》
或者使用国内opencv镜像进行编译(爆红的地方都是下载失败的问题,由于github在国内访问困难,使用国内gitcode仓库的代码库,会自动从国内镜像下载。具体参考此文章:《下载不再卡顿,OpenCV中国镜像启用》

爆红解决后,配置config:
(1)勾选 OPENCV_ENABLE_NONFREE 项,否则在运行SIFT、SURF等函数时会报错
(2)设置 OPENCV_EXTRA_MODULES_PATH 项,填入opencv-contrib的目录下的modules目录
(3)勾选 BUILD_opencv_world 项,如果需要把生成的opencv的lib和dll包含在一个文件opencv_world.lib和opencv_world.dll内则需要勾选,否则不用勾选
(4)勾选 WITH_FREETYPE 项,支持中文文字putText,但是要支持这一项,则必须先编译freetype和harfbuzz
(5)如果需要支持freetype,则需要在Opencv的Cmake配置中加入freetype的相关路径
windows下编译OpenCV带opencv_contrib和freetype_第9张图片

2021/04/30修改,上图中 FREETYPE_INCLUDE_DIR_ft2build 应填 D:/DevelopmentTools/freetype-2.10.0/install/include, 上图少了include目录

搜索一下harfbuzz,还要填入harfbuzz的相关目录和库文件,如下图图中的路径和上面的不一样,因为这是后面又补充的)
windows下编译OpenCV带opencv_contrib和freetype_第10张图片


填好后,再次在Cmake界面,点击 configure, 确定没报错后,点击 Generate,最后点击 Open Project,打开Visual studio,找到 ALL_BUILD 右键Build, 等待编译完成后, 找到 INSTALL 右键 Build

5. 示例


#include "opencv2/opencv.hpp"
#include "opencv2/freetype.hpp"

#include 

int main()
{
	cv::Mat img(200, 300, CV_8UC3, cv::Scalar(255, 255, 255));

	cv::Ptr<cv::freetype::FreeType2> freeType;
	freeType = cv::freetype::createFreeType2();
	freeType->loadFontData("C:/Windows/Fonts/simsun.ttc", 0);	// 加载字体文件,宋体

	// 在图片中显示带中文的文字
	freeType->putText(img, "测试 hello world!", cv::Point(10, 30), 20, cv::Scalar(255, 0, 0), 1, 8, true);

	cv::imshow("test", img);
	cv::waitKey(0);
	return 0;
}

执行显示效果:
windows下编译OpenCV带opencv_contrib和freetype_第11张图片
但是,在Visual Studio工程中编译上面c++代码,运行显示的结果中没有“测试”这两个汉字,只有 “hello world”, 因为Visual Studio的文件编码格式不是utf-8, 需要这样设置:

(1)修改文件编码格式,在VS工具栏中选择File -> Advanced Save Options(高级保存选项),如果你的VS中找不到Advanced Save Options,查看文章《Windows下编译OpenCV带Tesseract OCR》中的 2.2.1.1 VS中添加修改文件格式的命令 部分的方法进行设置
windows下编译OpenCV带opencv_contrib和freetype_第12张图片
windows下编译OpenCV带opencv_contrib和freetype_第13张图片
(2)在工程属性,C/C++ -> Command Line 里面添加一句:%(AdditionalOptions) /source-charset:utf-8 /execution-charset:utf-8
windows下编译OpenCV带opencv_contrib和freetype_第14张图片

上面设置好后,编译运行就能显示汉字了。


6. 编译好的OpenCV下载地址

下面是vs2017编译好的32位 opencv :
(1)opencv-4.5.4-带opencv_contrib和freetype-vs2017_x86版本
(2)opencv-4.5.2-带opencv_contrib和freetype-vs2017_x86版本


7. 参考文章

[1] https://yangshun.win/blogs/75d6773c/#freetype-%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE
[2] https://www.cnblogs.com/touch-skyer/p/14343791.html
[3] https://zhuanlan.zhihu.com/p/357042606
[4] https://zhuanlan.zhihu.com/p/357042606
[5] 下载不再卡顿,OpenCV中国镜像启用

你可能感兴趣的:(OpenCV,C++,opencv,cmake,freetype,harfbuzz)