使用cv::Point
与cv::Scalar
Point
表示2D平面上一个点x,y
Point p;
p.x = 10;
p.y = 8;
or
p = Pont(10,8);
-
Scalar
表示四个元素的向量Scalar(a, b, c);
// a = blue, b = green, c = red 表示RGB三个通道
绘制线、矩形、园、椭圆等基本几何形状
画线 `cv::line (LINE_4\LINE_8\LINE_AA)`
画椭圆`cv::ellipse`
画矩形`cv::rectangle`
画圆`cv::circle`
画填充`cv::fillPoly`
随机数生成`cv::RNG`
生成高斯随机数gaussian (double sigma)
生成正态分布随机数uniform (int a, int b)
绘制添加文字
`putText`函数中设置`fontFace(cv::HersheyFonts)`,
- fontFace, CV_FONT_HERSHEY_PLAIN
- fontScale , 1.0, 2.0~ 8.0
void cv::putText(
cv::Mat& img, // 待绘制的图像
const string& text, // 待绘制的文字
cv::Point origin, // 文本框的左下角
int fontFace, // 字体 (如cv::FONT_HERSHEY_PLAIN)
double fontScale, // 尺寸因子,值越大文字越大
cv::Scalar color, // 线条的颜色(RGB)
int thickness = 1, // 线条宽度
int lineType = 8, // 线型(4邻域或8邻域,默认8邻域)
bool bottomLeftOrigin = false // true='origin at lower left'
);
代码演示:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void MyLines(Mat image);
void MyEllipse(Mat image);
void MyCircle(Mat image);
void MyRectangle(Mat image);
void MyFillpoly(Mat image);
int main(char argc,char** argv)
{
Mat myImage = imread("women.jpg", 1);
if (!myImage.data)
{
cout << "couldn't load image..." << endl;
return -1;
}
MyLines(myImage);
MyEllipse(myImage);
MyCircle(myImage);
MyRectangle(myImage);
MyFillpoly(myImage);
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input",myImage);
waitKey(0);
return 0;
}
//画直线函数
void MyLines(Mat image)
{
Point p1 = Point(20, 20); //点类
Point p2;
p2.x = 400;
p2.y = 400;
Scalar color = Scalar(0, 0, 255); //颜色
line(image, p1, p2, color, 2,LINE_AA); //参数:背景图片、点1、点2、颜色、线宽、线型
}
//画椭圆函数
void MyEllipse(Mat image)
{
Scalar color = Scalar(0, 255, 0);
ellipse(image, Point(image.rows / 2, image.cols / 2), Size(image.rows / 8,
image.cols / 4),90,0,360,color, 2, LINE_8);//参数:背景图片、中心点、长短半径、旋转角度、0,360——范围、颜色、线宽、线型
}
//画圆函数
void MyCircle(Mat image)
{
Point p=Point(image.rows / 2, image.cols / 2);
Scalar color = Scalar(127, 0, 255);
circle(image, p, image.rows / 8, color, 2, LINE_8); //参数:背景图片、圆心、半径、颜色、线宽、线型、
}
//画矩形函数
void MyRectangle(Mat image)
{
Rect rect = Rect(100,200,100,50); //Rect类:成员变量x、y、width、height,分别为左上角点的坐标和矩形的宽和高
Scalar color = Scalar(255, 78, 94);
rectangle(image, rect, color, 2, LINE_4); //参数:背景图片、矩形类、线宽、线型
}
//画填充函数
void MyFillpoly(Mat image)
{
Point pts[1][5];
pts[0][0] = Point(200, 200);
pts[0][1] = Point(300, 200);
pts[0][2] = Point(300, 100);
pts[0][3] = Point(200, 100);
pts[0][4] = Point(200, 200);
const Point*ppts[] = { pts[0] };
int npt[] = { 5 };
Scalar color = Scalar(0, 255, 189);
fillPoly(image, ppts, npt, 1, color, LINE_8); //参数:背景图片、数据点指针、数据点个数、图像个数、颜色、线性
}
//画随机直线函数
void RandomLineDemo(Mat image)
{
RNG rng(12345); //随机数类 使用种子12345产生一个64位随机整数
Point p1, p2;
Mat image1 = Mat::zeros(image.size(), image.type());
namedWindow("Random line Remo", WINDOW_AUTOSIZE);
while (1)
{
p1.x = rng.uniform(0, image1.cols);
p1.y = rng.uniform(0, image1.rows);
p2.x = rng.uniform(0, image1.cols);
p2.y = rng.uniform(0, image1.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255),rng.uniform(0, 255));
if (waitKey(50) > 0) //等待时间为50ms,如果在这个时间段内, 用户按下任意按键(ASCII码>0),则跳出循环
{
break;
}
line(image1, p1, p2, color, 1, LINE_8);
imshow("Random line Remo", image1);
}
}
备注:以上内容转载笔者早期OneNote笔记,多为基础知识记录,比较简陋。
后记:笔者才疏学浅,如有错误,望指出。