画直线或者其他图形(虚线,圆,矩形等)的函数都接受宽度(thickenss)和线性(lineType)的参数,这两个都是整型的,但第二个参数的值只能是4,8或者cv::LINE__AA。thickness参数是指线宽的像素数,对于圆,矩形,和其他封闭图形,thickenss可以设置为cv::FULLD,这个图形就会被用和边界一样的颜色填充满。
lineType参数表示直线是“四邻域连接”还是“八邻域连接”或者是平滑处理。
circle(
cv::Mat& img, //输入图像
cv::Point center, //输入圆心
int radius, //半径
const cv::Scalar& color, //线条颜色
int thickness = 1, //线宽
int lineType = 8, //线型
int shift = 0 //圆心坐标点和半径值的小数位数
);
下面代码在一幅我们定义的图片上绘制了一个圆;
#include "pch.h"
#include
#include
using namespace std;
using namespace cv;
#define WINDOW_NAME "绘图"
#define WINDOW_WIDTH 300 //定义图像大小的宏
int main()
{
Mat img = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH,CV_8UC3);
Point2i pt(100,100);
circle(img,pt , 50, Scalar(255, 0, 0));
imshow("WINDOW_NAME", img);
waitKey();
return 0;
}
该函数在图像img上绘制一条从pt1到pt2的直线,直线自动被图像边缘截断;
line(
cv::Mat img, //输入图像
cv::Point pt1, //起点
cv::Point pt2, //终点
const cv::Scalar& color, //颜色
int lineType = 8, //线型
int shift = 0 //起点终点的小数位数
);
该函数有两种使用方法,一种传入矩形的两个相对的角点坐标,另一种是传入一个矩形Rect类;
rectangle(
cv::Mat img,
cv::Point pt1,
cv::Point pt2,
const cv::Scalar& color,
int lineType = 8,
int shift = 0
);
rectangle(
cv::Mat img,
cv::Rect r,
const cv::Scalar& color,
int lineType = 8,
int shift = 0
);
下面我们在之前画圆的函数里再加点东西:
Point2i pt1(50, 50); //矩形角点1
Point2i pt2(100, 100); //矩形角点2
Rect r(10, 10, 70, 70); //定义一个矩形
rectangle(img, pt1, pt2, Scalar(0, 0, 255));
rectangle(img, r, Scalar(0, 255, 0));
我们很自然的有另外一种需求,我们可以在图片上绘制矩形,那我们也想可以给图片加一些类似字幕的文字。这就是cv::putText()函数
putText(img, "zhouxuan", pt1, FONT_HERSHEY_SIMPLEX,1.0,Scalar(255,255,0));
// 输入图像 左下标 字形 大小 颜色
字形标识符:
FONT_HERSHEY_COMPLEX_SMALL; //小号版本的FONT_HERSHEY_COMPLEX
FONT_HERSHEY_SIMPLEX; //手写体
FONT_HERSHEY_DUPLEX; //普通大小无衬线字体,比 FONT_HERSHEY_SCRIPT_SIMPLEX 更复杂
FONT_HERSHEY_COMPLEX; //普通大小无衬线字体,比FONT_HERSHEY_DUPLEX 更复杂
FONT_HERSHEY_TRIPLEX; //普通大小无衬线字体,比FONT_HERSHEY_SCRIPT_COMPLEX 更复杂
FONT_HERSHEY_SCRIPT_COMPLEX; //比FONT_HERSHEY_SCRIPT_SIMPLEX更复杂的变体
FONT_HERSHEY_PLAIN; //小号无衬线字体
FONT_HERSHEY_SCRIPT_SIMPLEX; //普通大小无衬线字体