opencv的函數putText無法正確顯示中文。用freetype模塊可以加載字體,支持中文顯示。
在opencv-contrib里模塊有freetype,但是在window系統里直接用cmake編譯,無法顯示出freetype模塊。
網上查詢資料好多都在MAC和Linux上配置。查詢了內外網,終於找到方法,可以在Window上編譯通過。
朋友們,如果沒有編譯成功,評論我把編譯好的共享。
1.編譯安裝freetype
下載地址:https://download.savannah.gnu.org/releases/freetype/
默認Configure,Generate,OpenProject. 需要生成Debug和Release. 記得ALL_BUILD后INSTALL.
系統變量添加變量FREETYPE_DIR,目錄為C:/Program Files/freetype
2.編譯安裝harfbuzz
倉庫地址:https://github.com/harfbuzz/harfbuzz
初次Configure后,鈎選HB_HAVE_FREETYE,再次Configure.
設置好如下值
系統變量添加變量HARFBUZZ_DIR,目錄為C:/Program Files/harfbuzz
3.修改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()
4.編譯安裝OpenCv
初次Configure后,選擇contrib模塊路徑,同時把模塊集合在opencv_world上,可以如下勾選。
再次Configure.
會出現contrib里的module,已經出現freetype. 如果沒有正確出現,可以勾選Cmake上的Advanced把相關harfbuzz和freetype的路徑配置好。
5.最后Configure沒有出現紅色警示,點擊Genrate,Open Project.
6.VS里ALL_BUILD, INSTALL. 會在構建文件夾的install目錄下生成所需的include,和lib和dll.
7.測試
VS添加工程,配置好環境。添加編譯好的頭文件和lib.
opencv_world412d.dll放到工程文件夾下。
#include "stdafx.h" #include <opencv2\opencv.hpp> #include <opencv2\freetype.hpp> #pragma execution_character_set("utf-8") int main() { int fontHeight = 200; int thickness = -1; int linestyle = 8; cv::Mat img = cv::imread("c:/test.jpg"); cv::Ptr<cv::freetype::FreeType2> ft2; ft2 = cv::freetype::createFreeType2(); ft2->loadFontData("c:/Windows/Fonts/simfang.ttf", 0); //加載字庫文件 ft2->putText(img, "你好,中文 -- OpenCv", cv::Point(50,250), fontHeight, CV_RGB(0,0,255), thickness, linestyle, true); cv::namedWindow("box", 0); cv::imshow("box", img); cv::waitKey(0); return 0; }