opencv3学习笔记(四)下------opencv基本绘图

本文详细介绍使用OpenCV库进行基本图像绘制的方法,包括椭圆、实心圆、凹多边形、线和矩形的绘制过程及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本图像的绘制:

功能函数有: 

1、ellipse()函数(绘制椭圆)

    ellipse(img,//椭圆画到图像img上
        Point(WINDOW_WIDTH/2,WINDOW_WIDTH/2),//椭圆中心点
        Size(WINDOW_WIDTH/4,WINDOW_WIDTH/16),//大小位于矩形内
        angle,//椭圆旋转角度
        0,360,//扩展的弧度(0->360)
        Scalar(255,129,0),//图形颜色-----蓝色
        thickness,//eg线宽为2
        lineType);//线型为8(8联通线型)

2、circle()函数(绘制实心圆)

    circle(img,
        center,//圆心点
        WINDOW_WIDTH/32,//圆半径
        Scalar(0,0,255),//圆颜色(红)
        thickness,//线粗-1:实心的
        lineType);//线型为8(8联通线型)
}

3、fillPoly()函数(凹多边形的绘制)---------
    fillPoly(img,
        ppt,//多边形定点集
        npt,//要绘制的多边形的定点数
        1,//绘制多边形的个数
        Scalar(255,255,255),//白色
        lineType);//线型为8(8联通线型)

}

4、line()函数(线的绘制)
    line(img,
        start,
        end,//直线段的起始点
        Scalar(0,0,0),//黑色
        thickness,
        lineType);

  5、rectangle()函数--------绘制矩形
    rectangle(rookImage,
        Point(0,7*WINDOW_WIDTH/8),
        Point(WINDOW_WIDTH,WINDOW_WIDTH),
        Scalar(0,255,255),
        -1,
        8);

  代码示例:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;
#define WINDOW_NAME1 "【绘制图1】" //为窗口标题定义的宏
#define WINDOW_NAME2 "【绘制图2】" //为窗口标题定义的宏
#define WINDOW_WIDTH 600    //定义窗口大小的宏

//--------DrawEllipse()函数(绘制椭圆)---------
void DrawEllipse(Mat img,double angle)
 {
	int thickness = 2;
	int lineType = 8;

	ellipse(img,//椭圆画到图像img上
		Point(WINDOW_WIDTH/2,WINDOW_WIDTH/2),//椭圆中心点
		Size(WINDOW_WIDTH/4,WINDOW_WIDTH/16),//大小位于矩形内
		angle,//椭圆旋转角度
		0,360,//扩展的弧度(0->360)
		Scalar(255,129,0),//图形颜色-----蓝色
		thickness,//线宽为2
		lineType);//线型为8(8联通线型)
}
//-------DrawFilledCircle()函数(绘制实心圆)---------
void DrawFilledCircle(Mat img,Point center) {
	int thickness = -1;
	int lineType = 8;

	circle(img,
		center,//圆心点
		WINDOW_WIDTH/32,//圆半径
		Scalar(0,0,255),//圆颜色(红)
		thickness,//线粗-1:实心的
		lineType);//线型为8(8联通线型)
}

//-----------DrawPolygon()函数(凹多边形的绘制)---------
void DrawPolygon(Mat img) {
	int lineType = 8;
	//创建一些点
	Point rookPoints[1][20];
	rookPoints[0][0] = Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
	rookPoints[0][1] = Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
	rookPoints[0][2] = Point(3 * WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
	rookPoints[0][3] = Point(11 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
	rookPoints[0][4] = Point(19 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
	rookPoints[0][5] = Point(3 * WINDOW_WIDTH / 4, 3*WINDOW_WIDTH / 8);
	rookPoints[0][6] = Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
	rookPoints[0][7] = Point(26 * WINDOW_WIDTH / 40,  WINDOW_WIDTH / 8);
	rookPoints[0][8] = Point(26 * WINDOW_WIDTH / 40,  WINDOW_WIDTH /4);
	rookPoints[0][9] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
	rookPoints[0][10] = Point(22 * WINDOW_WIDTH / 40,  WINDOW_WIDTH / 8);
	rookPoints[0][11] = Point(18*WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
	rookPoints[0][12] = Point(18*WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
	rookPoints[0][13] = Point(14*WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
	rookPoints[0][14] = Point(14*WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
	rookPoints[0][15] = Point(WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
	rookPoints[0][16] = Point(WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
	rookPoints[0][17] = Point(13*WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
	rookPoints[0][18] = Point(5*WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
	rookPoints[0][19] = Point(WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
	const Point*ppt[1] = {rookPoints[0]};
	int npt[] = {20};
	fillPoly(img,
		ppt,//多边形定点集
		npt,//要绘制的多边形的定点数
		1,//绘制多边形的个数
		Scalar(255,255,255),//白色
		lineType);//线型为8(8联通线型)

}

//----------DrawLine()函数(线的绘制)------------

void DrawLine(Mat img,Point start,Point end) {
	int thickness = 2;
	int lineType = 8;
	line(img,
		start,
		end,//直线段的起始点
		Scalar(0,0,0),//黑色
		thickness,
		lineType);
}
int main(void){
	//创建空白的Mat图像
	Mat atomImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH,CV_8UC3);
	Mat rookImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
	//-----绘制化学中的原子示例图------
	
	//先绘制椭圆
	DrawEllipse(atomImage,90);
	DrawEllipse(atomImage,0);
	DrawEllipse(atomImage,45);
	DrawEllipse(atomImage,-45);

	//绘制圆心
	DrawFilledCircle(atomImage,Point(WINDOW_WIDTH/2,WINDOW_WIDTH/2));

	//---------绘制组合图-------

	//先绘多边形
	DrawPolygon(rookImage);

	//绘制矩形
	rectangle(rookImage,
		Point(0,7*WINDOW_WIDTH/8),
		Point(WINDOW_WIDTH,WINDOW_WIDTH),
		Scalar(0,255,255),
		-1,
		8);

	//绘制一些线段
	DrawLine(rookImage,Point(0,15*WINDOW_WIDTH/16),Point(WINDOW_WIDTH,15*WINDOW_WIDTH/16));
	DrawLine(rookImage, Point(WINDOW_WIDTH/4, 7 * WINDOW_WIDTH / 8),Point(WINDOW_WIDTH/4,WINDOW_WIDTH));
	DrawLine(rookImage, Point(WINDOW_WIDTH / 2, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH / 2, WINDOW_WIDTH));
	DrawLine(rookImage, Point(3*WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(3*WINDOW_WIDTH / 4, WINDOW_WIDTH));

	//----------显示绘制出的图像----------
	imshow(WINDOW_NAME1,atomImage);
	moveWindow(WINDOW_NAME1,0,200);
	imshow(WINDOW_NAME2,rookImage);
	moveWindow(WINDOW_NAME2,WINDOW_WIDTH,200);

	waitKey (0);
	return(0);
}

结果如下: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值