在Qt中解决opencv的putText函数无法绘制中文的一种解决方法

文章目录

1.问题

在opencv中,假如直接使用putText绘制中文,会在图像上出现问号,如下图所示:

2.查阅资料

查了一些资料,说想要解决这个问题,需要用到freetype库或者用opencv5(详情请查看文末的参考资料)。但是我现在用的是opencv4,freetype库已经被移到opencv_contrib去了,用起来麻烦,而且用freetype的话,其实也是相当于用了第三方库来实现:

cpp 复制代码
...
	cv::Ptr<cv::freetype::FreeType2> ft2;
	ft2=cv::freetype::createFreeType2();
...
	// then put the text itself
	ft2->putText(img, text, textOrg, fontHeight,
             cv::Scalar(255,0,0), thickness, linestyle, true );

那我Qt也是第三方库啊,还倒不如直接用Qt实现呢。

3.解决办法

于是,我实现了一个myPutText函数

cpp 复制代码
int myPutText(cv::Mat &img, QString text, QPoint org, QFont font, QPen pen)
{
    QImage::Format imgFormat;

    switch (img.channels()) {
    case 1:
        imgFormat = QImage::Format_Grayscale8;
        break;
    case 3:
        imgFormat = QImage::Format_RGB888; // 没有BGR格式,因此要注意一下pen的color
        break;
    default:
        return -1;
        break;
    }

		// 直接共享了Mat的内存,不存在内存复制。所以应该不怎么耗时
    QImage tmpImg(img.data, img.cols, img.rows, img.step, imgFormat);

    QPainter painter(&tmpImg);
    painter.setPen(pen);
    painter.setFont(font);
    painter.drawText(org, text);

    return 0;
}

用法如下:

cpp 复制代码
    cv::Mat img = cv::imread("4.bmp", cv::IMREAD_COLOR);
    cv::resize(img, img, cv::Size(640, 480));

    QString tempText = "中文";

    QPen pen;
    pen.setColor(QColor(0, 255, 0));

    QFont font;
    font.setPixelSize(32);

    myPutText(img, tempText, QPoint(100, 100), font, pen);

//    cv::putText(img, tempText.toStdString(), cv::Point(100, 100), cv::FONT_HERSHEY_TRIPLEX, 1.0, cv::Scalar(255, 255, 0));
    cv::imshow("img", img);

效果如下:


参考资料
【关于OpenCV无法putText汉字的坑】
【听说putText()支持中文了?!】

相关推荐
低客的黑调1 分钟前
Redis-不止是缓存
java·开发语言·数据库
花间相见5 分钟前
【大模型微调与部署02】—— ms-swift 自定义数据集完全教程:格式、dataset_info 配置、多格式兼容实战
开发语言·ssh·swift
Hello--_--World9 分钟前
JS:闭包、函数柯里化、工厂函数、偏函数、立即执行函数 相关知识点与面试题
开发语言·javascript·ecmascript
ComputerInBook11 分钟前
OpenCV图像处理——图像缩放函数 resize
图像处理·opencv·计算机视觉
一只幸运猫.13 分钟前
字节跳动Java大厂面试版
java·开发语言·面试
xier_ran21 分钟前
【C++】“内部”、“外部”、“派生类”、“友元“类
java·开发语言·c++
im_AMBER29 分钟前
从面试题看JS变量提升
开发语言·前端·javascript·前端框架
故事和你9129 分钟前
洛谷-数据结构1-2-二叉树1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
大橘30 分钟前
【qml-5.1】qml与c++交互(QML_ELEMENT/QML_SINGLETON)
开发语言·c++·qt·交互·qml
凭君语未可31 分钟前
从静态代理走向动态代理:理解 JDK 动态代理的本质
java·开发语言