2012-08-11 7 views

risposta

3

E 'possibile utilizzare altri tipi di carattere, ma è necessario collegare la libreria Qt per OpenCV e utilizzare la funzione cvAddText con un cvFontQt

http://docs.opencv.org/modules/highgui/doc/qt_new_functions.html#addtext

http://docs.opencv.org/modules/highgui/doc/qt_new_functions.html#fontqt

Ci sono altre soluzioni si possono provare, con più o meno le stesse prestazioni di OpenCV. Ad esempio, è possibile utilizzare CAIRO per scrivere caratteri nell'immagine.

9

Se non puoi o non vuoi utilizzare i binding Qt, ecco un modo per farlo con 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); 
} 

Esempio chiamata:

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

Si presuppone che l'obiettivo l'immagine è BGR.

Posiziona il centro del testo sul punto specificato. Se si desidera posizionare diversamente, è necessario modificare la chiamata cairo_move_to.

+0

Questa è una buona risposta! –

+0

Grazie per il suggerimento. Ma "centerAnchor" si riferisce a "centerPoint"? E come possiamo installare Cairo su Ubuntu 16.04? – user1098761

+0

@ user1098761 'sudo apt installa libcairo2-dev'. Se si utilizza CMake, è possibile seguire questa risposta https://stackoverflow.com/questions/41636886/cairo-library-and-cmake. Ho usato FindCairo.cmake da WebKit. –

Problemi correlati