image - OpenCV:如何将 HERSHEY 以外的其他字体与 cvPutText(如 Arial)一起使用

标签 image opencv truetype

我想将格式化文本写入图像。 OpenCV 仅提供一组有限的默认字体。是否可以使用其他人?例如从 *.ttf 文件(在 Ubuntu 中)读取它们?

最佳答案

如果您不能或不想使用 Qt 绑定(bind),这里有一种使用 CAIRO 的方法:

#include <opencv2/opencv.hpp>
#include <cairo/cairo.h>
#include <string>

void putTextCairo(
        cv::Mat &targetImage,
        std::string const& text,
        cv::Point2d centerPoint,
        std::string const& fontFace,
        double fontSize,
        cv::Scalar textColor,
        bool fontItalic,
        bool fontBold)
{
    // Create Cairo
    cairo_surface_t* surface =
            cairo_image_surface_create(
                CAIRO_FORMAT_ARGB32,
                targetImage.cols,
                targetImage.rows);

    cairo_t* cairo = cairo_create(surface);

    // Wrap Cairo with a Mat
    cv::Mat cairoTarget(
                cairo_image_surface_get_height(surface),
                cairo_image_surface_get_width(surface),
                CV_8UC4,
                cairo_image_surface_get_data(surface),
                cairo_image_surface_get_stride(surface));

    // Put image onto Cairo
    cv::cvtColor(targetImage, cairoTarget, cv::COLOR_BGR2BGRA);

    // Set font and write text
    cairo_select_font_face(
                cairo,
                fontFace.c_str(),
                fontItalic ? CAIRO_FONT_SLANT_ITALIC : CAIRO_FONT_SLANT_NORMAL,
                fontBold ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL);

    cairo_set_font_size(cairo, fontSize);
    cairo_set_source_rgb(cairo, textColor[2], textColor[1], textColor[0]);

    cairo_text_extents_t extents;
    cairo_text_extents(cairo, text.c_str(), &extents);

    cairo_move_to(
                cairo,
                centerPoint.x - extents.width/2 - extents.x_bearing,
                centerPoint.y - extents.height/2- extents.y_bearing);
    cairo_show_text(cairo, text.c_str());

    // Copy the data to the output image
    cv::cvtColor(cairoTarget, targetImage, cv::COLOR_BGRA2BGR);

    cairo_destroy(cairo);
    cairo_surface_destroy(surface);
}

调用示例:

putTextCairo(mat, "Hello World", cv::Point2d(50,50), "arial", 15, cv::Scalar(0,0,255), false, false);

假设目标图像是BGR。

它将文本的中心置于给定点。如果你想要一些不同的定位,你必须修改 cairo_move_to 调用。

关于image - OpenCV:如何将 HERSHEY 以外的其他字体与 cvPutText(如 Arial)一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11917124/

相关文章:

html - 为什么 srcset 不选择更接近视口(viewport)大小的较小图像

python - 来自两个向量的3D转换矩阵

c++ - 如何在 OpenCV 中获取旋转矩形的顶点?

java - 如何用sql代码将图片文件保存到mysql,用java怎么显示?

css - 阻止 "Hover Zoom"插件显示缩放的 img(或向 img div 添加类)

Java验证图像头

opencv - 使用mingw构建tbb时链接错误,同时opencv运行时错误

python - Reportlab 和 Fontawesome 字体

android - 为什么我在 Android 应用程序中的自定义字体在 Release模式下被默认字体替换?

fonts - DejaVu 是否支持 CJK(中文、日文、韩文)字形?