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

在mac电脑上管理这些gnu的库一般都使用Homebrew,但总有一些你个性化的需要是官方的Homebrew配方无法满足的。比如在屏幕的输出中使用中文字符。
在OPENCV中输出UTF8字符集早已经有人完成过类似的工作,方法是使用freetype的支持,程序中选择使用的字库,从而在屏幕上输出任意的字符。但官方的Homebrew OPENCV的配方中,并不包含freetype的支持。这时候,只好自己来编译OPENCV及contrib库,因为freetype的支持就在contrib库中。
编译安装
OPENCV的开发已经非常成熟,所以编译过程并不复杂,大致包含如下的过程:
- 使用App Store安装Xcode,随后执行一次Xcode根据提示安装其命令行工具。
- 使用brew安装第三方的依赖库,比如git/cmake/freetype等,很多依赖库根据你使用的模块不同,也有不同的需求。大多依赖库如果你不安装,OPENCV在编译的时候会自动下载,但下载和编译的过程都很慢,不如提前预装编译好的版本。
brew install cmake automake pkg-config ant autoconf git freetype
- 准备一个工作目录,下载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库)的更多相关文章
- PHP页面显示中文字符出现乱码
[出现问题] php页面显示中文字符出现乱码 [解决方法] 在php页面的代码前插入一行代码即可 header("Content-Type: text/html;charset=utf-8& ...
- VS2013 Qt5显示中文字符
VS2013上建立的Qt5project中显示中文字符的两种方式: 1. QStringLiteral("開始") 2. QString::fromLocal8Bit(" ...
- cocos2d-x 显示中文字符和解析XML文件 转载
源地址:http://codingnow.cn/cocos2d-x/1038.html 在cocos2d-x中直接显示中文的时候会出现乱码,虽然在实际开发中把字符串直接写在代码里也不是好的做法,但是有 ...
- vi/vim显示中文字符并且去掉^M的方法
vim上经常会碰到中文显示不正常的现象,也就是传说中的乱码.搜索了一下,在 http://www.chinalinuxpub.com/bbs/showthread.php?t=45475 找到了一个解 ...
- linux又一次编译安装gd,添加freetype支持,解决验证码不显示问题,Fatal error: Call to undefined function imagettftext()
问题: Fatal error: Call to undefined function Think\imagettftext() in /var/www/webreg/ThinkPHP/Library ...
- Qt5显示中文字符
在cpp文件或.h文件中顶行输入: #pragma execution_character_set("utf-8")
- spynner解析中文页面,应该显示中文字符的地方都是?的解决方案
这个是底层的QtWebKit相关库里 用的是Qt的QString spynner在将QString转为Python的通用字符串时,没有考虑到中文编码这一块的问题. Python27\Lib\site- ...
- 【openCV学习笔记】在Mac上配置openCV步骤详解
(1)安装Homebrew:(需要Ruby) 注:因为snow leopard 以后已经自带Ruby了,所有可以不用自己安装Ruby. 看一下Homebrew的官网: http://mxcl.gith ...
- Mac上安装openCV(Java版本)
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt410 Install and use OpenCV 3.0 on Mac O ...
随机推荐
- js-面试题-驼峰命名
//将字符串转为驼峰命名‘foo-bar-car-day-efg’ function toUpperCase(str){ var string=str.split('-'); var arr=[]; ...
- python基础知识总结(一)
学完python很久了,一直想着写个学习总结,奈何懒癌晚期,现在才开始写.以下是我总结的一小部分python基础知识点的总结: 1.什么是解释型语言?什么是编译型编程语言? ''' 解释型语言:无需编 ...
- Hibernte
什么是CRM?(了解) CRM(customer relationship management)即客户关系管理,是指企业用CRM技术来管理与客户之间的关系.在不同场合下,CRM可能是一个管理学术语, ...
- ajaj简介
1. 什么是ajax? ajax的全称 Asynchronous(异步) JavaScript and XML. ajax是一种用于创建快速动态网页的技术. 主要用于前后台的交互,在前后台的交互中还有 ...
- 弄懂CNN,然后提升准确率4.21-4.27
英语: 1.每天背单词,75起步.(这周没怎么背,考虑调整了) 2.并背王江涛图画作文一:传统文化(这周没背,但肯定要做) 学校: 0.吴恩达ML 1.毕设一:可视化,肺癌基因突变,深度学习(那么作图 ...
- vue简单指令笔记
v-once 执行一次性插值,数据改变插值处内容不会更新 <span v-once>这个将不会改变: {{ msg }}</span> v-text 插入文本 <!--两 ...
- Prometheus 企业微信报警/inhibit抑制 /静默(二)
创建企业微信应用 注册企业微信:访问https://work.weixin.qq.com/,注册企业,随便填,不需要认证 创建应用 创建告警配置 vim /usr/local/prometheus-2 ...
- Python3小知识点
1. 是转义字符,\可以输出.在一行的末尾单独的一个\表示这行没有结束,下一行接着写 2.可以用"'或"""把一大段话引起来(可以换行)然后赋值,输出. 3.要 ...
- 【react】---手动封装一个简易版的redux
export let createStore = (reducer)=>{ //定义默认的state let state; //定义默认的action let actionTypes = &qu ...
- SEED实验——Environment Variable and Set-UID Program实验报告
任务一:操作环境变量 实验过程一: 用printenv或env打印出环境变量. 在终端输入命令,显示结果如下图所示: 经过实验发现,printenv和env均可输出当前系统的环境变量.不同的是prin ...