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


    1.问题

    在opencv中,假如直接使用putText绘制中文,会在图像上出现问号,如下图所示:
    在这里插入图片描述

    2.查阅资料

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

    ...
    	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 );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    3.解决办法

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

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    用法如下:

        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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    效果如下:

    在这里插入图片描述


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

  • 相关阅读:
    【zookeeper】zookeeper日常运维
    docker部署多个node-red操作过程
    全栈交叉编译X86完成过程经验分享
    1422. 分割字符串的最大得分
    vue3 | 数据可视化实现数字滚动特效
    商鼎云|2022星际文件系统训练营活动回顾
    [nlp] 对抗学习 FGM, PGD到FreeLB
    十一月29号作业
    vue3新语法糖<script setup>
    数据结构-二叉树
  • 原文地址:https://blog.csdn.net/joyopirate/article/details/134177989