OpenCV 4.X 使用CvxText在图片显示汉字
最近又需要在图像上实时绘制汉字。一般来讲如果绘制汉字的需求绕不过的话,直接绘制在图片总归是最easy的实现方式。因为不然的话可能要额外调用GUI组件来实现。一般都是用freetype+cvxtext,老生常谈。且不说实际实现起来是否最easy,主要是这种方法多年来实践了无数次了,不过今次切换到OpenCV4.5,突然发现可能又要修改CvxText代码才可以,因为直接使用,不work。
准备 需要的依赖有:
C/C++ 编译环境(似乎是废话) OpenCV (仍然废话) freetype的lib: 提前编译好,官网是 https://freetype.org/,我使用的版本是2.9.1 字体文件,一般用simhei.ttf。在操作系统的字体里面哦。 修改 CvxText 代码 我这里有一份CvxText代码,在旧版本的OpenCV下可以使用(OpenCV3.X)。如今更换到了OpenCV4.5,这份代码直接使用会有些小问题,不过都很容易修改。
OpenCV头文件包含方式 首先需要重写头文件包含方法。在OpenCV4以前,include下有两个子目录,分别是opencv,和opencv2。在OpenCV4.X后,include下只剩一个opencv2文件夹了。涉及到opencv的头文件包含代码,改为如下形式:
#include "opencv2/core/core.hpp" #include "opencv2/core/core_c.h" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" 这里特别说明,引入core_c.h这个头文件很重要。因为我手里这份CvxText代码类型都是基于旧式的C类型,core_c.h 提供了对C类型的兼容。
CvScalar类型问题 下一处需要修改的是和CvScalar相关的代码。尽管我们重新写了头文件包含,引入了C类型,但是有些代码仍然不能直接编译通过, 因为CvScalar不能隐式的转为C++类型的cv::Scalar。下面的puttext函数代码中,我修改了显式的手工转换替代了注释中的代码。样子很丑,但是简单好用(总共花费了不到1分钟)。
int CvxText::putText(cv::Mat &frame, const char *text, CvPoint pos) { //return putText(frame, text, pos, CV_RGB(255, 255, 255)); CvScalar s = {255, 255, 255}; return putText(frame, text, pos, s); } int CvxText::putText(cv::Mat &frame, const wchar_t *text, CvPoint pos) { //return putText(frame, text, pos, CV_RGB(255, 255, 255)); CvScalar s = {255, 255, 255}; return putText(frame, text, pos, s); } cv::Mat转为IplImage 另一处就是比较老生常谈的问题,cv::Mat转为IplImage。这里之前的实现是直接采用C形式的强制转换,如下所示: