在mac电脑上管理这些gnu的库一般都使用Homebrew,但总有一些你个性化的需要是官方的Homebrew配方无法满足的。比如在屏幕的输出中使用中文字符。

  在OPENCV中输出UTF8字符集早已经有人完成过类似的工作,方法是使用freetype的支持,程序中选择使用的字库,从而在屏幕上输出任意的字符。但官方的Homebrew OPENCV的配方中,并不包含freetype的支持。这时候,只好自己来编译OPENCV及contrib库,因为freetype的支持就在contrib库中。

编译安装

  OPENCV的开发已经非常成熟,所以编译过程并不复杂,大致包含如下的过程:

  1. 使用App Store安装Xcode,随后执行一次Xcode根据提示安装其命令行工具。
  2. 使用brew安装第三方的依赖库,比如git/cmake/freetype等,很多依赖库根据你使用的模块不同,也有不同的需求。大多依赖库如果你不安装,OPENCV在编译的时候会自动下载,但下载和编译的过程都很慢,不如提前预装编译好的版本。
brew install cmake automake pkg-config ant autoconf git freetype
  1. 准备一个工作目录,下载OPENCV和contrib的源码(以OPENCV3.4为例):
mkdir source
cd source
git clone --single-branch -b 3.4 https://github.com/opencv/opencv.git
git clone --single-branch -b 3.4 https://github.com/opencv/opencv_contrib.git

master分支可能会包含一些并不稳定的代码,所以不推荐使用master分支的代码。

4. 配置、编译及安装

mkdir source/opencv/build
cd source/opencv/build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ ..
make -j4
sudo make install

  上面这种方式通常能满足大多的需求。如果你不想要在编译中加入所有的扩展包,可以使用BUILD_opencv_*的参数屏蔽,比如:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ -DBUILD_opencv_legacy=OFF ..

  如果已经使用Homebrew安装了OPENCV,并不想全部重新安装,只想安装freetype支持,可以手工将编译出的freetype部分拷贝到系统路径:  

cp source/opencv-3.4.3/build/lib/libopencv_freetype* /usr/local/lib/
cp source/opencv_contrib-3.4/modules/freetype/include/opencv2/freetype.hpp /usr/local/include/opencv2/

  然后还要在pkg-config配置文件中增加freetype库的链接(使用make install的自动安装是不需要这一步的):

vi /usr/local/lib/pkgconfig/opencv.pc
在Libs一行的最后增加:-lopencv_freetype

使用

  使用freetype替代opencv原有的文字输出功能很简单,这里提供一个修改过的官方样例,假设文件名为drawUtf8.cpp:

#include <opencv2/opencv.hpp>
#include <opencv2/freetype.hpp> using namespace std;
using namespace cv; int main(int argc,char **argv){
String text = "Hello世界!*毛*泽*东";
int fontHeight = 60;
int thickness = -1;
int linestyle = 8;
int baseline=0; Ptr<freetype::FreeType2> ft2;
ft2 = freetype::createFreeType2();
//下面的字库要自己下载并拷贝到需要的位置
ft2->loadFontData( "/user/local/ttf/maozedong.ttf", 0 ); namedWindow("box");
Mat img(600, 800, CV_8UC3, Scalar::all(0)); Size textSize = ft2->getTextSize(text,
fontHeight,
thickness,
&baseline);
if(thickness > 0){
baseline += thickness;
} Point textOrg((img.cols - textSize.width) / 2,
(img.rows + textSize.height) / 2);
rectangle(img, textOrg + Point(0, baseline),
textOrg + Point(textSize.width, -textSize.height),
Scalar(0,255,0),1,8);
line(img, textOrg + Point(0, thickness),
textOrg + Point(textSize.width, thickness),
Scalar(0, 0, 255),1,8);
ft2->putText(img, text, textOrg, fontHeight,
Scalar::all(255), thickness, linestyle, true );
imshow("box",img); while(1){ if(waitKey(100)==27)break; } return 0;
}

  随后编译执行:

#编译
g++ -o drawUtf8 drawUtf8.cpp $(pkg-config --cflags --libs opencv)
#执行
./drawUtf8

  执行的效果请参看题头图。

  最后一种情况,如果编译后只想在当前目录使用,不想安装。这种情况通常还是并不常见,因为默认OPENCV是使用动态编译,各项依赖库如果不安装到系统路径,是无法使用的。可以考虑在cmake参数中增加-DBUILD_SHARED_LIBS=0选项来进行静态编译,但这种情况我并没有尝试,参数仅来自于官方的介绍。

  在当前目录中进行应用程序的编译最主要是配置头文件路径及链接库文件的路径,这些内容是比较多的,建议自己使用Makefile或者建立脚本文件来编译,比如mk.sh:

#!/bin/sh
CFLAGS="-I source/opencv/include -I source/opencv_contrib/modules/freetype/include -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_photo -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_dnn -lopencv_plot -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ml -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_flann -lopencv_xobjdetect -lopencv_imgcodecs -lopencv_objdetect -lopencv_xphoto -lopencv_imgproc -lopencv_core -lopencv_freetype"
LDFLAGS="-L source/opencv/build/lib"
g++ $CFLAGS -o $1 $1.cpp $LDFLAGS

  使用举例:./mk.sh drawUtf8

参考资料

官方的编译介绍:https://github.com/opencv/opencv_contrib

contrib模块列表:https://github.com/opencv/opencv_contrib/tree/3.4/modules

为OPENCV添加freetype支持并显示中文字符(在mac上编译opencv及contrib库)的更多相关文章

  1. PHP页面显示中文字符出现乱码

    [出现问题] php页面显示中文字符出现乱码 [解决方法] 在php页面的代码前插入一行代码即可 header("Content-Type: text/html;charset=utf-8& ...

  2. VS2013 Qt5显示中文字符

    VS2013上建立的Qt5project中显示中文字符的两种方式: 1. QStringLiteral("開始") 2. QString::fromLocal8Bit(" ...

  3. cocos2d-x 显示中文字符和解析XML文件 转载

    源地址:http://codingnow.cn/cocos2d-x/1038.html 在cocos2d-x中直接显示中文的时候会出现乱码,虽然在实际开发中把字符串直接写在代码里也不是好的做法,但是有 ...

  4. vi/vim显示中文字符并且去掉^M的方法

    vim上经常会碰到中文显示不正常的现象,也就是传说中的乱码.搜索了一下,在 http://www.chinalinuxpub.com/bbs/showthread.php?t=45475 找到了一个解 ...

  5. linux又一次编译安装gd,添加freetype支持,解决验证码不显示问题,Fatal error: Call to undefined function imagettftext()

    问题: Fatal error: Call to undefined function Think\imagettftext() in /var/www/webreg/ThinkPHP/Library ...

  6. Qt5显示中文字符

    在cpp文件或.h文件中顶行输入: #pragma execution_character_set("utf-8")

  7. spynner解析中文页面,应该显示中文字符的地方都是?的解决方案

    这个是底层的QtWebKit相关库里 用的是Qt的QString spynner在将QString转为Python的通用字符串时,没有考虑到中文编码这一块的问题. Python27\Lib\site- ...

  8. 【openCV学习笔记】在Mac上配置openCV步骤详解

    (1)安装Homebrew:(需要Ruby) 注:因为snow leopard 以后已经自带Ruby了,所有可以不用自己安装Ruby. 看一下Homebrew的官网: http://mxcl.gith ...

  9. Mac上安装openCV(Java版本)

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt410 Install and use OpenCV 3.0 on Mac O ...

随机推荐

  1. python控制语句---循环结构语句

    这次主要把循环结构的控制语句补上,主要包含while.for.continue.break.循环嵌套.主要写一些基本的认识以及包含的一些实例.当只有唯一路径且只跑一次的时候选择上一节中的选择结构语句就 ...

  2. cgi、fast-cgi、php-pfm关系

    CGI是一种规定了服务器和处理进程的数据传输格式的协议 如:nginx 和 php处理进程之间的数据传输是使用cgi格式来相互传输数据 CGI 是 接到请求,fork一条进程来处理,处理完后就退出. ...

  3. python基础----1. globals和locals

    官方文档 globals """ Return a dictionary representing the current global symbol table. Th ...

  4. Ubuntu server 16.04安装,无网卡驱动解决

    因为使用一个软件必须要在ubuntu server 16.04上安装,因此先在裸机上安装ubuntu server 16.04,具体信息: 镜像版本:ubuntu-16.04.6-server-amd ...

  5. Java String类的intern()方法

    该方法的作用是把字符串加载到常量池中(jdk1.6常量池位于方法区,jdk1.7以后常量池位于堆) 在jdk1.6中,该方法把字符串的值复制到常量区,然后返回常量区里这个字符串的值: 在jdk1.7里 ...

  6. S0.4 二值图与阈值化

    目录 二值图的定义 二值图的应用 阈值化 二值化/阈值化方法 1,无脑简单判断 opencv3函数threshold()实现 2,Otsu算法(大律法或最大类间方差法) OpenCV3 纯代码实现大津 ...

  7. C\C++ 内存对齐现象

    前几天一个在自学C语言的小伙伴问了我个问题,C语言结构体储存所占空间为啥和自己预测的不一样.看一下下面这一段代码: struct node{ int num; char ch; }a; printf( ...

  8. 各个模块的刷新js

    // 更新页面中的subgrid function refreshSubGrid(subgridName) { Xrm.Page.ui.controls.get(subgridName).refres ...

  9. Java GC相关知识

    Java堆的分类 分为两类:YoungGen和OldGen.其中,YoungGen分为三部分:eden,from survivor和to survivor,比例默认是:8:1:1 PermGen不属于 ...

  10. dc的博客翻修计划启动

    紫书大部分学习完毕,等待一轮补完计划: 白书正在攻略中,进度百分之30: 博客翻修计划启动,我会在本学期内逐渐写系统性的学习笔记,我学习时遇到的困难的地方会有说明: 每个部分一定会放上经过验证的实现: ...