点、线、矩形、圆形、椭圆、多边形、绘制与填充、文字;
随机绘制:随机函数RNG,绘制随机形状
比较详细的API中参数的介绍:学习OpenCV2——绘制基本图形及文字
-
线
利用line()API。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
//namedWindow("input",WINDOW_AUTOSIZE);
//imshow("input", canvas);
// 相关绘制API演示
// 绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
imshow("resulit",canvas);
waitKey(0);
destroyAllWindows();
return 0;
}
结果:
-
矩形
利用rect()和rectangle()API。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
//namedWindow("input",WINDOW_AUTOSIZE);
//imshow("input", canvas);
// 相关绘制API演示
// 绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
imshow("resulit",canvas);
// 绘制矩形
// 定义矩形大小(左上角的点,宽,高)
Rect rect(100,100,200,200);
// 绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
rectangle(canvas,rect,Scalar(255,0,0),1,8);
imshow("resulit",canvas);
waitKey(0);
destroyAllWindows();
return 0;
}
结果:
-
圆
利用circle()API
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
//namedWindow("input",WINDOW_AUTOSIZE);
//imshow("input", canvas);
// 相关绘制API演示
// 绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
imshow("resulit",canvas);
// 绘制矩形
// 定义矩形大小(左上角的点,宽,高)
Rect rect(100,100,200,200);
// 绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
rectangle(canvas,rect,Scalar(255,0,0),1,8);
imshow("resulit",canvas);
// 绘制圆(绘制所在画布,圆心,半径,颜色,线宽,渲染方式)
circle(canvas,Point(256,256),100,Scalar(0,255,0),1,8);
imshow("resulit",canvas);
waitKey(0);
destroyAllWindows();
return 0;
}
结果:
-
椭圆
利用RotatedRect制作旋转图形以及ellipse()椭圆生成API来生成椭圆.
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
//namedWindow("input",WINDOW_AUTOSIZE);
//imshow("input", canvas);
// 绘制线
// 绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
imshow("resulit",canvas);
// 绘制矩形
// 定义矩形大小(左上角的点,宽,高)
Rect rect(100,100,200,200);
// 绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
rectangle(canvas,rect,Scalar(255,0,0),1,8);
imshow("resulit",canvas);
// 绘制圆(绘制所在画布,圆心,半径,颜色,线宽,渲染方式)
circle(canvas,Point(256,256),100,Scalar(0,255,0),1,8);
// 绘制椭圆
RotatedRect rrt;
// 圆心
rrt.center = Point2f(256,256);
// 角度
rrt.angle = 45.0;
// 尺寸
rrt.size = Size(100,200);
// 绘制(所在花布,旋转的rectangle,颜色,线宽,渲染方式)
// 若将线宽变成-1(<时0),将会变成填充的形式;线宽>0时是绘制的方式
ellipse(canvas,rrt,Scalar(0,255,255),2,8);
imshow("resulit",canvas);
waitKey(0);
destroyAllWindows();
return 0;
}
结果:
-
绘制随机线条
利用RNG函数.
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
//namedWindow("input",WINDOW_AUTOSIZE);
//imshow("input", canvas);
// 绘制线
// 绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
imshow("resulit",canvas);
// 绘制矩形
// 定义矩形大小(左上角的点,宽,高)
Rect rect(100,100,200,200);
// 绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
rectangle(canvas,rect,Scalar(255,0,0),1,8);
imshow("resulit",canvas);
// 绘制圆(绘制所在画布,圆心,半径,颜色,线宽,渲染方式)
circle(canvas,Point(256,256),100,Scalar(0,255,0),1,8);
// 绘制椭圆
RotatedRect rrt;
// 圆心
rrt.center = Point2f(256,256);
// 角度
rrt.angle = 45.0;
// 尺寸
rrt.size = Size(100,200);
// 绘制(所在花布,旋转的rectangle,颜色,线宽,渲染方式)
// 若将线宽变成-1(<时0),将会变成填充的形式;线宽>0时是绘制的方式
ellipse(canvas,rrt,Scalar(0,255,255),2,8);
imshow("resulit",canvas);
// 丰富绘制
// 绘制线条
Mat image = Mat::zeros(Size(512,512),CV_8UC3);
int x1 = 0,y1 = 0;
int x2 = 0,y2 = 0;
// 随机
RNG rng(12345);
while(true)
{
// 定义随机的起始坐标和终点坐标
x1 = (int)rng.uniform(0,512);
x2 = (int)rng.uniform(0,512);
y1 = (int)rng.uniform(0,512);
y2 = (int)rng.uniform(0,512);
// 线(所在画布:image,随机起点,随机终点,随机颜色,线宽,渲染方式);
line(image,Point(x1,y1),Point(y1,y2),Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),1,LINE_8);
imshow("image",image);
// waitKey按任意键返回(停顿10ms)
char c = waitKey(10);
// 按Esc键暂停
if(c == 27)
break;
}
imwrite("../result.jpg",image);
waitKey(0);
destroyAllWindows();
return 0;
}
结果:
-
绘制随机矩形
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
//namedWindow("input",WINDOW_AUTOSIZE);
//imshow("input", canvas);
// 绘制线
// 绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
imshow("resulit",canvas);
// 绘制矩形
// 定义矩形大小(左上角的点,宽,高)
Rect rect(100,100,200,200);
// 绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
rectangle(canvas,rect,Scalar(255,0,0),1,8);
imshow("resulit",canvas);
// 绘制圆(绘制所在画布,圆心,半径,颜色,线宽,渲染方式)
circle(canvas,Point(256,256),100,Scalar(0,255,0),1,8);
// 绘制椭圆
RotatedRect rrt;
// 圆心
rrt.center = Point2f(256,256);
// 角度
rrt.angle = 45.0;
// 尺寸
rrt.size = Size(100,200);
// 绘制(所在花布,旋转的rectangle,颜色,线宽,渲染方式)
// 若将线宽变成-1(<时0),将会变成填充的形式;线宽>0时是绘制的方式
ellipse(canvas,rrt,Scalar(0,255,255),2,8);
imshow("resulit",canvas);
// 丰富绘制
// 绘制线条
Mat image = Mat::zeros(Size(800,800),CV_8UC3);
int x1 = 0,y1 = 0;
int x2 = 0,y2 = 0;
// 随机
RNG rng(12345);
while(true)
{
// 定义随机的左上角坐标和左下角坐标
x1 = (int)rng.uniform(0,512);
x2 = (int)rng.uniform(0,512);
y1 = (int)rng.uniform(0,512);
y2 = (int)rng.uniform(0,512);
// 确定宽和高
int w = abs(x2-x1);
int h = abs(y2-y1);
rect.x = x1;
rect.y = y1;
rect.width = w;
rect.height = h;
// 绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
rectangle(image,rect,Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),1,8);
imshow("image",image);
// waitKey按任意键返回(停顿10ms)
char c = waitKey(10);
// 按Esc键暂停
if(c == 27)
break;
}
imwrite("../result.jpg",image);
waitKey(0);
destroyAllWindows();
return 0;
}
结果:
如果只想要每次出现只出现一个矩形,可以在前面加上:
// 只出现一个矩形
image = Scalar(0,0,0);
完整代码为:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
//namedWindow("input",WINDOW_AUTOSIZE);
//imshow("input", canvas);
// 绘制线
// 绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
imshow("resulit",canvas);
// 绘制矩形
// 定义矩形大小(左上角的点,宽,高)
Rect rect(100,100,200,200);
// 绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
rectangle(canvas,rect,Scalar(255,0,0),1,8);
imshow("resulit",canvas);
// 绘制圆(绘制所在画布,圆心,半径,颜色,线宽,渲染方式)
circle(canvas,Point(256,256),100,Scalar(0,255,0),1,8);
// 绘制椭圆
RotatedRect rrt;
// 圆心
rrt.center = Point2f(256,256);
// 角度
rrt.angle = 45.0;
// 尺寸
rrt.size = Size(100,200);
// 绘制(所在花布,旋转的rectangle,颜色,线宽,渲染方式)
// 若将线宽变成-1(<时0),将会变成填充的形式;线宽>0时是绘制的方式
ellipse(canvas,rrt,Scalar(0,255,255),2,8);
imshow("resulit",canvas);
// 丰富绘制
// 绘制线条
Mat image = Mat::zeros(Size(512,512),CV_8UC3);
int x1 = 0,y1 = 0;
int x2 = 0,y2 = 0;
// 随机
RNG rng(12345);
while(true)
{
// 定义随机的左上角坐标和左下角坐标
x1 = (int)rng.uniform(0,512);
x2 = (int)rng.uniform(0,512);
y1 = (int)rng.uniform(0,512);
y2 = (int)rng.uniform(0,512);
// 确定宽和高
int w = abs(x2-x1);
int h = abs(y2-y1);
rect.x = x1;
rect.y = y1;
rect.width = w;
rect.height = h;
// 只出现一个矩形
image = Scalar(0,0,0);
// 绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
rectangle(image,rect,Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),1,8);
imshow("image",image);
// waitKey按任意键返回(停顿10ms)
char c = waitKey(10);
// 按Esc键暂停
if(c == 27)
break;
}
imwrite("../result.jpg",image);
waitKey(0);
destroyAllWindows();
return 0;
}
出现结果非常酷:
实际上,在运行窗口中,这些随机矩形出现消失的非常快.整体看起来很酷.
-
文字
// 文字(所在画布,打印文字,位置,字体类型,字体大小,字体颜色,加粗,渲染通道)
putText(canvas,"hello opencv!",Point(100,50),FONT_HERSHEY_SIMPLEX,1.0,Scalar(255,0,255),2,8);
imwrite("../result.jpg",canvas);
结果: