UnaNancyOwen
12/22/2016 - 4:47 PM

How to use OpenCV FreeType module with Visual Studio

How to use OpenCV FreeType module with Visual Studio

cmake_minimum_required( VERSION 3.6 )

# Create Project
project( test )
add_executable( freetype main.cpp )

# Set StartUp Project
set_property( DIRECTORY PROPERTY VS_STARTUP_PROJECT "freetype" )

# Set CharacterSet
if( MSVC )
  set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8" )
endif()

# Find Package
set( OpenCV_DIR "C:/Program Files/opencv/build" )
set( OpenCV_STATIC OFF )
find_package( OpenCV REQUIRED )

if( OpenCV_STATIC AND MSVC )
  foreach(flag_var
        CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
        CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
    if(${flag_var} MATCHES "/MD")
      string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
    endif(${flag_var} MATCHES "/MD")
  endforeach(flag_var)
endif()

if( OpenCV_FOUND )
  # Additional Include Directories
  include_directories( ${OpenCV_INCLUDE_DIRS} )

  # Additional Library Directories
  link_directories( ${OpenCV_LIB_DIR} )

  # Additional Dependencies
  target_link_libraries( freetype ${OpenCV_LIBS} )
endif()

OpenCV FreeType Module

Dependencies

Fix

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

Demo

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/freetype.hpp>

int main( int argc, char* argv[] )
{
    cv::Mat image = cv::imread( "../lena.jpg" );
    if( image.empty() ){
        return -1;
    }

    // Create FreeType2
    cv::Ptr<cv::freetype::FreeType2> ft2 = cv::freetype::createFreeType2();
    
    // Load Font Data
    ft2->loadFontData( "../NotoSansCJKjp-Regular.otf", 0 );

    // Put Text
    ft2->putText( image, "cv::freetype::putText()", cv::Point( 50, 50 ), 30, cv::Scalar( 255, 255, 255 ), -1, cv::LINE_AA, false );
    ft2->putText( image, "ABCDEFG", cv::Point( 50, 100 ), 30, cv::Scalar( 255, 255, 255 ), -1, cv::LINE_AA, false );
    ft2->putText( image, "あいうえお", cv::Point( 50, 150 ), 30, cv::Scalar( 255, 255, 255 ), -1, cv::LINE_AA, false );

    cv::imshow( "freetype", image );
    cv::waitKey( 0 );

    return 0;
}