一、基本函数介绍:
(1)点:
Point a = Point (1000,1000);
(2)文字函数putText():
void putText( CvArr* img, const char* text, CvPoint org, const CvFont* font,CvScalar color );
img:
输入图像
text:
要显示的字符串
org:
第一个字母左下角的坐标
font:
指向字体结构的指针
color:[1] 文本的颜色.
(3)绘制直线:line():
CV_EXPORTS_W void line(CV_IN_OUT Mat&img, Point pt1, Point pt2, const Scalar& color,
int thickness=1, intlineType=8, int shift=0);
img:要绘制线段的图像
pt1和pt2:线段的起点和终点
color:线段的颜色
thickness:线段的粗细
Type:线段的类型
shift:坐标点小数点的位数
(4)绘制椭圆ellipse():
CV_EXPORTS_W void ellipse(CV_IN_OUTMat& img, Point center, Size axes,
double angle, doublestartAngle, double endAngle,
const Scalar&color, int thickness=1,
int lineType=8, intshift=0);
img: 要绘制椭圆的图像。
center: 椭圆中心点坐标。
axes: 椭圆位于该Size决定的矩形内。(即定义长轴和短轴)。
angle: 椭圆旋转角度。
startAngle: 椭圆开始绘制时角度。
endAngle: 椭圆绘制结束时角度。(若绘制一个完整的椭圆,则startAngle=0, endAngle = 360)。
color: 椭圆的颜色。
thickness: 绘制椭圆线粗。负数表示全部填充。
lineType,shift:同上。
(5)绘制矩形rectangle():
CV_EXPORTS_W void rectangle(CV_IN_OUTMat& img, Point pt1, Point pt2,
const Scalar&color, int thickness=1,
int lineType=8, intshift=0);
pt1: 矩形的左上角坐标。
pt2: 矩阵的右下角坐标。
(6)绘制圆形circle():
CV_EXPORTS_W void circle(CV_IN_OUT Mat&img, Point center, int radius,
const Scalar& color,int thickness=1,
int lineType=8, int shift=0);
center: 圆心坐标。
radius: 半径。
(7)填充多边形fillPloy():
CV_EXPORTS void fillPoly(Mat& img,const Point** pts,
const int* npts, intncontours,
const Scalar&color, int lineType=8, int shift=0,
Point offset=Point());
pts: 多边形定点集。
npts: 多边形的顶点数目。
ncontours: 要绘制多边形的数量。
offset: 所有点轮廓的可选偏移。
二、程序组合体现:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src(1000, 1000, CV_8UC3, Scalar(0, 100, 255));
string words = "A simple example";
putText(src, words, Point(src.rows / 4, src.cols / 6), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 0, 0));
Point center = Point(300, 200);
int r = 50;
circle(src, center, r, Scalar(0, 0, 0));
ellipse(src, center, Size(100, 200), -45, 0, 360, Scalar(0, 0, 0),4);
Point start = Point(400, 150);
line(src, start, center, Scalar(255, 0, 0));
rectangle(src, start, center, Scalar(255, 0, 0));
imshow("画板", src);
waitKey(0);
return 0;
}
结果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TM0YTNwYzM1ETOwkDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
三、综合复杂例子:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
#include <opencv2/imgproc/imgproc.hpp>
#define WINDOW_NAME "【绘制图】" //为窗口标题定义的宏
#define WINDOW_WIDTH 600//定义窗口大小的宏
void DrawEllipse(Mat img, double angle);//绘制椭圆
void DrawFilledCircle(Mat img, Point center);//绘制圆
//void DrawPolygon(Mat img);//绘制多边形
//void DrawLine(Mat img, Point start, Point end);//绘制线段
//
int main(void)
{
Mat backgroundImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
DrawEllipse(backgroundImage, 30);
DrawEllipse(backgroundImage, 0);
DrawEllipse(backgroundImage, -30);
DrawEllipse(backgroundImage, -60);
DrawEllipse(backgroundImage, -90);
DrawEllipse(backgroundImage, 90);
DrawEllipse(backgroundImage, 60);
DrawFilledCircle(backgroundImage, Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 4));
namedWindow("WINDOW_NAME", 0);
imshow(WINDOW_NAME, backgroundImage);
waitKey(0);
return(0);
}
void DrawEllipse(Mat img, double angle)
{
int thickness = 2;
int lineType = 8;
ellipse(img,
Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 4),
Size(WINDOW_WIDTH / 4, WINDOW_WIDTH / 16),
angle,
0,
360,
Scalar(100,0 ,100),
thickness,
lineType);
}
void DrawFilledCircle(Mat img, Point center)
{
int thickness = -2;
int lineType = 2;
circle(img,
center,
WINDOW_WIDTH / 32,
Scalar(0, 0, 255),
thickness,
lineType);
}
结果:
四、在平面上画矩形例子
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
#define WINDOW_NAME "【程序窗口】"
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle(Mat& img, Rect box);
Rect g_rectangle;
bool g_bDrawingBox = false;//是否进行绘制
RNG g_rng(12345);
int main()
{
Mat srcImage(1000, 1000, CV_8UC3, Scalar(0, 100, 255));
Mat tempImage;
srcImage.copyTo(tempImage);
g_rectangle = Rect();
namedWindow(WINDOW_NAME);
setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);//传给回调的参数
while (1)
{
srcImage.copyTo(tempImage);
if (g_bDrawingBox)
DrawRectangle(tempImage, g_rectangle);//移动鼠标时的过程被保留下来
imshow(WINDOW_NAME, tempImage);
if (waitKey(10) == 27)
break;
}
return 0;
}
void on_MouseHandle(int event, int x, int y, int flags, void* param)//param是用户定义的传递到setMouseCallback函数调用的参数。
{
Mat& image = *(Mat*) param;
switch (event)
{
//鼠标移动
case EVENT_MOUSEMOVE:
{
if (g_bDrawingBox)
{
g_rectangle.width = x - g_rectangle.x;
g_rectangle.height = y - g_rectangle.y;
}
}
break;
//右键按下消息
case EVENT_RBUTTONDOWN:
{
g_bDrawingBox = true;
g_rectangle = Rect(x, y, 0, 0);//记录起始点
}
break;
//右键抬起消息
case EVENT_RBUTTONUP:
{
//置标识符为fals
g_bDrawingBox = false;
//调用函数进行绘制
DrawRectangle(image, g_rectangle);
}
break;
}
}
void DrawRectangle(Mat& img, Rect box)
{
Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));//随机颜色
rectangle(img, box.tl(), box.br(), color);//画矩阵框
}
我分析的草图:
结果:
五、资料参考:
opencv学习之小木匠