C++ 使用cv::Mat类型时如何在图像上覆盖文本
我正在使用opencv 2.1。在我的代码中,有一些图像存储为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
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对象,但没有成功。