Как наложить текст на изображение при работе с типом cv :: Mat - PullRequest
25 голосов
/ 03 марта 2011

Я использую 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)’

Что мне нужно сделать, чтобы иметь возможность добавить текст при отображении этого изображения?

Ответы [ 6 ]

61 голосов
/ 03 марта 2011

Я искал не в том месте.Я нашел ответ в новой документации 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);

Надеюсь, это кому-нибудь поможет.

18 голосов
/ 08 мая 2016

Для базового использования 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), // BGR Color
            1, // Line Thickness (Optional)
            cv::CV_AA); // Anti-alias (Optional)

См. putText () в документах OpenCV.

8 голосов
/ 01 июня 2012
putText(result, "Differencing the two images.", cvPoint(30,30), 
    FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(200,200,250), 1, CV_AA);

В приведенной выше строке «result» должен быть cvArr * или IplImage *. но из приведенного здесь кода, я полагаю, вы передаете объект cv :: Mat. Поэтому вам нужно либо преобразовать его с помощью cvarrToMat (), либо передать & result вместо result.

Надеюсь, это поможет

2 голосов
/ 17 октября 2016

Одна неприятная деталь, которую я увидел в моем тестовом коде: обратите внимание на строку импорта - она ​​не отображается в большинстве примеров и должна быть правильной.

Мой тестовый код использовал только приведенный выше пример 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 центов.

2 голосов
/ 24 января 2015

Вы также можете сделать следующее для печати текста и переменных.

    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 голосов
/ 26 апреля 2015

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 эта функция у меня не сработала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...