天天看点

opencv之简单几何图形实现

一、基本函数介绍:

(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;
}
           

结果:

opencv之简单几何图形实现

三、综合复杂例子:

#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);
}
           

结果:

opencv之简单几何图形实现

四、在平面上画矩形例子

#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之简单几何图形实现

结果:

opencv之简单几何图形实现

五、资料参考:

opencv学习之小木匠

继续阅读