Как наложить текст на изображение при работе с cv:: Mat type
Я использую opencv 2.1. В моем коде у меня есть несколько изображений, сохраненных как объекты Mat, инициализированные следующим образом:
Mat img1 = imread("img/stuff.pgm", CV_LOAD_IMAGE_GRAYSCALE);
Я могу отобразить их правильно, используя imshow() после выполнения моих операций с матрицей. Теперь я хочу добавить текст на изображение, чтобы описать, что произошло. Глядя на документацию, кажется, что cvPutText()
будет функцией, которая мне нужна. Но когда я пробую что-то вроде этого:
cvPutText(result, "Differencing the two images.", cvPoint(30,30), &font, GREEN);
Я получаю следующую ошибку компиляции:
error: cannot convert ‘cv::Mat’ to ‘CvArr*’ for argument ‘1’ to ‘void cvPutText(CvArr*, const char*, CvPoint, const CvFont*, CvScalar)’
Что мне нужно сделать, чтобы добавить текст при отображении этого изображения?
Ответы
Ответ 1
Я искал не то место. Я нашел ответ в новой документации OpenCV для cpp. Существует новая функция putText(), которая принимает объекты cv:: Mat. Поэтому я пробовал эту строку, и она работает:
putText(result, "Differencing the two images.", cvPoint(30,30),
FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(200,200,250), 1, CV_AA);
Надеюсь, это поможет кому-то.
Ответ 2
putText(result, "Differencing the two images.", cvPoint(30,30),
FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(200,200,250), 1, CV_AA);
В приведенной выше строке "результат" должен быть cvArr * или IplImage *. но из приведенного здесь кода, я думаю, вы передаете объект cv:: Mat.
Таким образом, вам нужно либо преобразовать его, используя cvarrToMat(), либо передать результат вместо результата.
Надеюсь, что это поможет
Ответ 3
Для базового использования С++:
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
См. putText() в документах OpenCV.
Ответ 4
Вы также можете сделать следующее для печати текста и переменных.
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));
Ответ 5
Одна неприятная деталь, которую я видел в своем тестовом коде: обратите внимание на элемент импорта - он не отображается в большинстве примеров и должен быть правильным импортом.
В моем тестовом коде использовался только пример putText, и я включил imgproc.h так же, как и в мой старый код. Код, скомпилированный и связанный, однако, я столкнулся с одним странным поведением с putText (некоторый мусор в мое изображение).
Это была PITA, пока я не понял, что импорт ввязался в мою социальную жизнь...
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;
}
}
Затем я просто изменил импорт imgproc выше на
#include <opencv2/opencv.hpp> // << It does includes ALL opencv stuff
Мои 5 центов.
Ответ 6
putText (img1, "TextString123", cvPoint (50,200), FONT_HERSHEY_SCRIPT_SIMPLEX, 2.5, cvScalar (255,0,0,255), 3, CV_AA);
Вы можете найти более подробную информацию здесь: http://docs.opencv.org/2.4.9/modules/core/doc/drawing_functions.html
Основное отличие между этим ответом и ответами выше - это значение 7-го параметра, уровень толщины. С толщиной == 1 эта функция не сработала для меня.