2011-03-03 21 views
17

Estoy usando opencv 2.1. En mi código tengo unas pocas imágenes almacenadas como objetos Mat inicializados como esto:Cómo superponer texto en la imagen cuando se trabaja con cv :: Mat type

Mat img1 = imread("img/stuff.pgm", CV_LOAD_IMAGE_GRAYSCALE); 

puedo mostrar de forma adecuada mediante imshow() después de mis operaciones con matrices se hacen. Ahora quiero agregar algo de texto en la imagen para describir lo que sucedió. Mirando la documentación, parece que cvPutText() sería la función que necesito. Pero cuando intento algo como esto:

cvPutText(result, "Differencing the two images.", cvPoint(30,30), &font, GREEN);

me sale el siguiente error de compilación: error: cannot convert ‘cv::Mat’ to ‘CvArr*’ for argument ‘1’ to ‘void cvPutText(CvArr*, const char*, CvPoint, const CvFont*, CvScalar)’

¿Qué tengo que hacer para ser capaz de añadir un poco de texto cuando se muestra esta imagen?

Respuesta

50

Estaba buscando en el lugar equivocado. Encontré la respuesta en el más reciente OpenCV documentation for cpp. Hay una nueva función llamada putText() que acepta objetos cv :: Mat. Así que probé esta línea y funciona:

putText(result, "Differencing the two images.", cvPoint(30,30), 
    FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(200,200,250), 1, CV_AA); 

Espero que esto ayude a alguien.

+1

Desafortunadamente, esto solo funciona para caracteres ASCII ... Si alguien tiene una mejor solución, ¡la tomaré! –

+1

@ Eliyahu-Shmuel es 'putText' no 'PutText'. Lo uso como 'cv :: putText' – nmante

+0

No me imprime nada en mi imagen. mi código: Mat fre = imread ("1.jpg", 0); \t putText (fre, "Diferenciando las dos imágenes.", CvPoint (30, 30), \t \t FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar (200, 200, 250), 1, CV_AA); –

8
putText(result, "Differencing the two images.", cvPoint(30,30), 
    FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(200,200,250), 1, CV_AA); 

En la línea anterior, el "resultado" debe ser un cvArr * o un IplImage *. pero del código proporcionado aquí, supongo que está pasando un objeto cv :: Mat. Por lo tanto, debe convertirlo usando cvarrToMat() o pasar & resultado en lugar de resultado.

creo que sirve

+0

Buena captura, no sabía de esta conversión, la estaba usando con un objeto Mat sin éxito. – agodinhost

2

También puede hacer lo siguiente para imprimir texto y variables.

std::ostringstream str; 
    str << "Here is some text:" << myVariable; 
    cv::putText(image, cv::Point(10,10), str.str(), CV_FONT_HERSHEY_PLAIN, CV_RGB(0,0,250)); 
+0

Esto no parece funcionar. ¿Por qué hay 'i's en tu escalar? ¿por qué '<<" Aquí ... "' fuera del paréntesis? No pude obtener este ejemplo para compilar. –

+0

Sé lo que es el operador. Tu respuesta no se compila como está y no dejaste ninguna explicación sobre lo que está sucediendo. Esperaba que editases tu respuesta a un MWE que realmente compila. –

+0

He actualizado la respuesta. Gracias por la corrección. La sobrecarga '<<' necesita otra biblioteca que no forme parte de la distribución de openCV por defecto. – RawMean

-1

putText (img1, "TextString123", cvPoint (50200), FONT_HERSHEY_SCRIPT_SIMPLEX, 2,5, cvScalar (255,0,0,255), 3, CV_AA);

Puede encontrar más información aquí: http://docs.opencv.org/2.4.9/modules/core/doc/drawing_functions.html

La principal diferencia entre esta respuesta y las respuestas de lo alto es el valor del parámetro 7-ésimo, el nivel de espesor. Con grosor == 1, esta función no me ha funcionado.

+0

Esta pregunta ya ha recibido una respuesta satisfactoria, por lo que realmente necesita un poco de explicación para justificar qué es diferente/mejor acerca de su respuesta. Tampoco está claro a partir de su respuesta qué es 'matImg1' (no aparece en la pregunta). – DavidW

+0

@DavidW Gracias por los comentarios. He editado mi respuesta. –

+0

Esto usa la interfaz C de openCV (vs C++) que es realmente antigua. – RawMean

7

para el uso básico de C++:

cv::putText(yourImageMat, 
      "Here is some text", 
      cv::Point(5,5), // Coordinates 
      cv::FONT_HERSHEY_COMPLEX_SMALL, // Font 
      1.0, // Scale. 2.0 = 2x bigger 
      cv::Scalar(255,255,255), // Color 
      1, // Thickness 
      cv::CV_AA); // Anti-alias 

Ver putText() en documentos OpenCV.

1

Un desagradable detalle que vi en mi código de prueba: preste atención a la tabla de importación: no se muestra en la mayoría de los ejemplos y debe ser la importación correcta.

Mi código de prueba usó solo la muestra de putText anterior e incluí el archivo imgproc.h tal como lo hice con algunos de mis códigos anteriores. El código compilado y vinculado bien, sin embargo, estaba enfrentando un comportamiento extraño con el putText (algo de basura en mi imagen).

Fue un PITA hasta que me di cuenta de que la importación estaba jugando con mi vida social ...

imagetext.CPP

#include "Imaging/imageText.h" 
#include "Commons/xLog.h" 
#include "opencv2/imgproc.hpp" // << Seems to work right? 
using namespace cv; 

namespace imaging 
{ 
    inline Mat image2mat(SmartImage image) NOEXCEPTION 
    { 
     //TODO: hard coded to work only with CV_8UC3, see the other cases ... 
     Mat mat(
     Size(image->WIDTH, image->HEIGHT), 
     CV_8UC3, 
     image->buffer, 
     Mat::AUTO_STEP 
    ); 

     return mat; 
    } 

    inline void _writeText_(SmartImage image, const string TEXT) 
    { 
     Mat mat(image2mat(image)); 

     string text = "Funny text inside the box"; 
     int fontFace = FONT_HERSHEY_SCRIPT_SIMPLEX; 
     double fontScale = 2; 
     int thickness = 3; 
     Point textOrg(10, 130); 
     putText(mat, text, textOrg, fontFace, fontScale, Scalar::all(255), thickness, 8); 
    } 

    const bool writeText(SmartImage image, const string text) NOEXCEPTION 
    { 
     try 
     { 
     _writeText_(image, text); 
     return true; 
     } 
     catch(cv::Exception& e) 
     { 
     LOG_ERROR("writeText OpenCV ERROR: " << e.what() << "!"); 
     } 
     catch(...) 
     { 
     LOG_ERROR("writeText ERROR!"); 
     } 
     return false; 
    } 
} 

Entonces sólo cambió la importación imgproc anterior a

#include <opencv2/opencv.hpp> // << It does includes ALL opencv stuff 

Mis 5 centavos.

Cuestiones relacionadas