opencv
中的(0,0)
坐标是在图像的左上角。
cv::putText
的用法:对于cv::putText
后面参数int lineType = 8
, 是线型(4邻域或8邻域,默认8邻域),实际工程中我一般选择16邻域的cv::LINE_AA
或者CV_AA
或者直接填16
,这三种填法都是一个意思。看起来平滑效果很好,不填的话默认8邻域
,看起来字体有锯齿的样子,不好看。所以建议填上该参数值为16
领域。
建议像下面这样组合,效果会好看些:
cv::putText(img, str, pt, cv::FONT_HERSHEY_SIMPLEX, 0.5, CV_RGB(255, 255, 0), 1, 16);
cv::FONT_HERSHEY_SIMPLEX
字体类型会比 cv::FONT_HERSHEY_PLAIN
字体类型默认显示的大一些,所以,通常字体尺寸设为0.5
,字体就是正常大小。
字体和大小如下图所示:
一般会将 cv::getTextSize()
与 cv::putText()
结合使用:
cv::getTextSize() //实际绘制文字之前,使用cv::getTextSize()接口先获取待绘制文本框的大小,以方便放置文本框。返回值为cv::Size。设返回值为size,可以通过size.width和size.height来获取文本框的宽和高.
cv::putText() //在图像上绘制文字
//在Mat上画矩形矩形框,如果要填充矩形,需要把thickness设为-1。详解看后面。
cv::rectangle()
//矩形,有成员变量左上角x,左上角y,weight,height,如Rect rect1(256, 256, 128, 128),这样用是构造函数;
cv::Rect
//定义一个2D的点:如Point point = Point(10, 8);或者 Point point;//创建一个2D点对象 point.x = 10;//初始化x坐标值 point.y = 8;//初始化y坐标值
cv::Point()
//一般作为值来设置颜色。他是一个由长度为4的数组作为元素构成的结构体,Scalar最多可以存储四个值,没有提供的值默认是0。
cv::Scalar(255, 255, 0)
// 关于cv::Scalar的更详细资料可以参考 https://blog.csdn.net/liuweiyuxiang/article/details/76929534
cv::Size cv::getTextSize(
const string& text, // 待绘制的文字
int fontFace, // 字体类型 (如 cv::FONT_HERSHEY_PLAIN, cv::FONT_HERSHEY_SIMPLEX)
double fontScale, // 尺寸因子,值越大文字越大
int thickness, // 线条宽度
int* baseLine
);
void cv::putText(
cv::Mat& img, // 待绘制的图像
const string& text, // 待绘制的文字
cv::Point origin, // 文本框的左下角坐标(x,y),记住是左下角,不是左上角,要和cv::rectangle()的左上角区分开
int fontFace, // 字体类型 (如cv::FONT_HERSHEY_PLAIN, cv::FONT_HERSHEY_SIMPLEX)
double fontScale, // 尺寸因子,值越大文字越大
cv::Scalar color, // 线条的颜色(RGB)
int thickness = 1, // 线条宽度
int lineType = 8, // 线型(4邻域或8邻域,默认8邻域),选择16邻域的cv::LINE_AA或者CV_AA效果很好
bool bottomLeftOrigin = false // true='origin at lower left'
);
// 对于在图片中画矩形框的函数,C++中opencv对void cv::rectangle()重载了两种用法:
// pt1 矩形的一个顶点; pt2 矩形对角线上的另一个顶点; color 线条颜色 (RGB) 或亮度(灰度图像 )
// thickness 组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
// line_type 线条的类型。见cvLine的描述。 shift 坐标点的小数点位数。
// 两个函数的不同之处在于第二个函数把第一个函数中的两个对角线定点改为了cv::Rect。
void cv::rectangle(cv::Mat& img, cv::Point pt1, cv::Point pt2, const cv::Scalar& color, int thickness=1, int lineType=8, int shift=0)
void cv::rectangle(cv::Mat& img, cv::Rect rec, const cv::Scalar& color, int thickness=1, int lineType=8, int shift=0 )
下面通过一个示例,来看看cv::getTextSize()
与cv::putText()
相结合的妙用:
{
//创建空白图用于绘制文字
cv::Mat image = cv::Mat::zeros(cv::Size(640, 480), CV_8UC3);
//设置蓝色背景
image.setTo(cv::Scalar(100, 0, 0));
//设置绘制文本的相关参数
std::string text = "Hello World!";
int font_face = cv::FONT_HERSHEY_COMPLEX;
double font_scale = 2;
int thickness = 2;
int baseline;
//获取文本框的长宽
cv::Size text_size = cv::getTextSize(text, font_face, font_scale, thickness, &baseline);
//将文本框居中绘制
cv::Point origin;
origin.x = image.cols / 2 - text_size.width / 2;
origin.y = image.rows / 2 + text_size.height / 2;
cv::putText(image, text, origin, font_face, font_scale, cv::Scalar(0, 255, 255), thickness, 8, 0);
//显示绘制结果
cv::imshow("image", image);
cv::waitKey(0);
return 0;
}
=================================================================
cv::Mat
与cv::Rect
在一起使用的情况// cv::Mat frame;
// cv::Rect rect;
//创建的新图像img是fram的一部分,具体的范围rect指定,此构造函数也不进行图像数据的复制操作,新图像img与frame共用图像数据。
cv::Mat img(frame, rect); //cv::Mat::Mat(cv::Mat const&, cv::Rect_ const&) 这种方式构造函数创建的img,他的两个参数都不能修改,因为是const,修改后就会出错。
cv::Mat img1(img2); //拷贝构造
img1(rect); //从img1中截取rect区域,返回cv::Mat。
=================================================================