OpenCv - freetype 模塊的編譯 (支持中文輸出到圖片)


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;

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM