web-dev-qa-db-ja.com

cv :: Matタイプを使用して画像にテキストをオーバーレイする方法

私は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)’

この画像を表示するときにテキストを追加するには、何をする必要がありますか?

25
Aras

私は間違った場所を見ていました。新しい cppのOpenCVドキュメント で答えを見つけました。 cv :: Matオブジェクトを受け入れるputText()という新しい関数があります。だから私はこの行を試しましたが、それは動作します:

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

これが誰かを助けることを願っています。

61
Aras

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)

OpenCVドキュメントの putText() を参照してください。

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

上記の行の「result」はcvArr *またはIplImage *である必要があります。しかし、ここで提供されているコードから、cv :: Matオブジェクトを渡していると思います。そのため、cvarrToMat()を使用して変換するか、resultではなく&resultを渡す必要があります。

それが役に立てば幸い

8
Bilal Saeed

テキストと変数を印刷するには、次のこともできます。

    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

私のテストコードで見た厄介な詳細の1つは、インポートステーションに注意してください。ほとんどの例には表示されておらず、正しいインポートである必要があります。

私のテストコードは上記の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
agodinhost