web-dev-qa-db-fra.com

Comment superposer du texte sur l'image lorsque vous travaillez avec le type cv :: Mat

J'utilise opencv 2.1. Dans mon code, j'ai quelques images stockées en tant qu'objets Mat initialisés comme ceci:

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

Je peux les afficher correctement en utilisant imshow () une fois mes opérations matricielles terminées. Maintenant, je veux ajouter du texte sur l'image pour décrire ce qui s'est passé. En regardant la documentation, il semble que cvPutText() serait la fonction dont j'ai besoin. Mais quand j'essaye quelque chose comme ça:

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

J'obtiens l'erreur de compilation suivante: error: cannot convert ‘cv::Mat’ to ‘CvArr*’ for argument ‘1’ to ‘void cvPutText(CvArr*, const char*, CvPoint, const CvFont*, CvScalar)’

Que dois-je faire pour pouvoir ajouter du texte lors de l'affichage de cette image?

25
Aras

Je regardais au mauvais endroit. J'ai trouvé la réponse dans le plus récent documentation OpenCV pour cpp . Il existe une nouvelle fonction appelée putText () qui accepte les objets cv :: Mat. J'ai donc essayé cette ligne et ça marche:

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

J'espère que cela aide quelqu'un.

61
Aras

Pour une utilisation de base 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)

Voir putText () dans les documents OpenCV.

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

Dans la ligne ci-dessus, "result" devrait être un cvArr * ou un IplImage *. mais à partir du code fourni ici, je suppose que vous passez un objet cv :: Mat. Donc, vous devez soit le convertir en utilisant cvarrToMat () ou passer & result au lieu de result.

J'espère que cela aide

8
Bilal Saeed

Vous pouvez également effectuer les opérations suivantes pour imprimer du texte et des 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));
2
RawMean

Un détail désagréable que j'ai vu dans mon code de test: faites attention à l'import de l'importation - il n'est pas affiché dans la plupart des exemples et doit être la bonne importation.

Mon code de test n'a utilisé que l'exemple putText ci-dessus et j'ai inclus imgproc.h comme je l'ai fait dans certains de mes anciens codes. Le code compilé et lié correctement, mais je faisais face à un comportement étrange avec le putText (quelques ordures dans mon image).

C'était un PITA jusqu'à ce que je comprenne que l'importation gâchait ma vie sociale ...

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;
   }
}

Ensuite, je viens de changer l'importation imgproc ci-dessus pour

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

Mes 5 cents.

2
agodinhost