Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用cv::Mat类型时如何在图像上覆盖文本_C++_Opencv_Computer Vision - Fatal编程技术网

C++ 使用cv::Mat类型时如何在图像上覆盖文本

C++ 使用cv::Mat类型时如何在图像上覆盖文本,c++,opencv,computer-vision,C++,Opencv,Computer Vision,我正在使用opencv 2.1。在我的代码中,有一些图像存储为Mat对象,初始化如下: Mat img1 = imread("img/stuff.pgm", CV_LOAD_IMAGE_GRAYSCALE); 矩阵运算完成后,我可以使用imshow()正确显示它们。现在我想在图片上添加一些文字来描述发生了什么。查看文档,我需要的函数似乎是cvPutText()。但当我尝试这样的事情时: Mat img1 = imread("img/stuff.pgm", CV_LOAD_IMAGE_GRAYS

我正在使用opencv 2.1。在我的代码中,有一些图像存储为Mat对象,初始化如下:

Mat img1 = imread("img/stuff.pgm", CV_LOAD_IMAGE_GRAYSCALE);
矩阵运算完成后,我可以使用imshow()正确显示它们。现在我想在图片上添加一些文字来描述发生了什么。查看文档,我需要的函数似乎是
cvPutText()
。但当我尝试这样的事情时:

Mat img1 = imread("img/stuff.pgm", CV_LOAD_IMAGE_GRAYSCALE);
cvPutText(结果,“区分两幅图像”,cvPoint(30,30),&font,绿色)

我得到以下编译错误:
错误:无法将参数“1”的“cv::Mat”转换为“CvArr*”,将其转换为“void cvPutText(CvArr*,const char*,CvPoint,const CvFont*,CvScalar)”


当显示此图像时,我需要做什么才能添加一些文本?

我看错地方了。我在较新的报告中找到了答案。有一个名为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);
希望这对别人有帮助

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()或pass&result而不是result来转换它


希望它有帮助

您还可以执行以下操作来打印文本和变量

    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));
std::ostringstream str;
strputText(img1,“TextString123”、cvPoint(50200)、FONT\u HERSHEY\u SCRIPT\u SIMPLEX、2.5、cvScalar(255,0,0255)、3、CV\u AA)

您可以在此处找到更多信息:


这个答案和上面的答案之间的主要区别是第7个参数的值,厚度级别。厚度=1,此函数对我没有作用。对于OpenCV 3或更大的C++基础使用,

< P>:

cv::putText(yourImageMat, 
            "Text to add",
            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:: LINE_AA); // Anti-alias (Optional, see version note)
    
请参阅OpenCV 4文档或旧文档


注意:OpenCV 2.x之前的版本使用
CV_AA
而不是
LINE_AA

我在测试代码中看到的一个令人讨厌的细节:注意导入语句-它不会显示在大多数示例中,需要正确导入

我的测试代码只使用了上面的putText示例,我确实在一些旧代码中包含了imgproc.h。代码编译和链接很好,但是我在putText中遇到了一个奇怪的行为(我的图像中有一些垃圾)

这是一个皮塔,直到我发现进口是混乱了我的社会生活

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;
   }
}
#包括“Imaging/imageText.h”
#包括“Commons/xLog.h”
#包括“opencv2/imgproc.hpp”//WIDTH,image->HEIGHT),
CV_8UC3,
图像->缓冲区,
自动步进
);
返回垫;
}
内联void\u writeText(SmartImage图像,常量字符串文本)
{
Mat Mat(image2mat(image));
string text=“框内有趣的文本”;
int fontFace=FONT\u HERSHEY\u SCRIPT\u SIMPLEX;
双量程=2;
int厚度=3;
Point textOrg(10130);
putText(mat,text,textOrg,fontFace,fontScale,标量::全部(255),厚度,8);
}
常量bool writeText(SmartImage图像,常量字符串文本)无异常
{
尝试
{
_writeText(图像、文本);
返回true;
}
捕获(cv::异常和e)
{

LOG_ERROR(“writeText OpenCV ERROR:”如果您使用的是OpenCV 3.x或4.0,则必须将
CV_AA
替换为
LINE_AA
。因此,完整调用将是:

cv::putText(yourImageMat,
“要添加的文本”,
cv::点(5,5),//坐标
cv::FONT\u HERSHEY\u COMPLEX\u SMALL,//FONT
1.0,//比例。2.0=2倍大
cv::Scalar(255255),//BGR颜色
1,//线厚度(可选)
cv::LINE_AA);//反别名(可选)

这是在中发布的。

不幸的是,这只适用于ASCII字符…如果有人有更好的解决方案,我会接受它!@Eliyahu Shmuel它是'putText'而不是'putText'。我这样使用它
cv::putText
它不会在我的图像上打印任何内容。我的代码:Mat fre=imread(“1.jpg”,0);putText(fre,“区分两幅图像)”,cvPoint(30,30),FONT_HERSHEY_COMPLEX_SMALL,0.8,cvScalar(200,200,250),1,CV_AA);这个问题的答案已经令人满意,所以你确实需要一些解释来证明你的答案有什么不同/更好。从你的答案中也不清楚什么是
matImg1
(它没有出现在问题中)。这使用openCV的C接口(vs C++)这真的很旧。这似乎不起作用。为什么标量中有
i
s?为什么
我知道运算符是什么。你的答案没有按原样编译,你也没有解释发生了什么。我希望你能将你的答案编辑成实际编译的MWE。我更新了答案。谢谢你的更正。
很好,我不知道这个转换-我将它用于Mat对象,但没有成功。