阅读背景:

opencv Drawing Functions 全部函数使用说明

来源:互联网 
#include "stdafx.h"
#include "DrawingFunctions.h"
using namespace cv;

DrawingFunctions::DrawingFunctions()
{
}


DrawingFunctions::~DrawingFunctions()
{
}
void DrawingFunctions::Opencv_arrowedLine(Mat &matDraw)
{
	// 绘制箭头图标
	// pt1 箭头的起点
	// pt2 箭头的终点
	// thickness 箭头的粗度
	arrowedLine(matDraw, Point(100, 100), Point(200, 200), Scalar(0, 0, 255), 10); 
}
void DrawingFunctions::Opencv_circle(Mat &matDraw)
{
	// 绘制圆形图像
	// center 绘制圆形的圆心
	// radius 圆的半径
	// scalar 圆形的颜色
	// thickness 圆周的粗度
	circle(matDraw, Point(matDraw.cols / 2, matDraw.rows / 2), 100, Scalar(0, 0, 255), 1, LineTypes::LINE_AA);
}
void DrawingFunctions::Opencv_clipLine(Mat &matDraw)
{
	// 判断一条线是否在矩形内
	Point pt1(100,100), pt2(1000,1000)  ;
	Rect rect(0, 0, 10, 10);
	bool b = clipLine(rect,pt1,pt2);
	if(b)
	arrowedLine(matDraw, pt1, pt2, Scalar(0, 0, 255), 10);
}
void DrawingFunctions::Opencv_drawContours(Mat &matDraw)
{
	Mat mat;
	cvtColor(matDraw, mat, CV_BGR2GRAY);
	Mat dst,edge;

	GaussianBlur(mat, dst, Size(3, 3), 0.8);
	imwrite("gauss.bmp", dst);
	Canny(dst, edge, 60, 100);
	imwrite("Canny.bmp", edge);

	std::vector<std::vector<Point>> contour;
	std::vector<Vec4i> hierarchy;
	/************************************************************************/
	/* findContours 函数:
	/* coutours 存放轮廓的点
	/*  hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第
		i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果当前轮廓没有对应的后一个
		轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为
		默认值-1。    
		说明: 例如hierarchyhierarchy[i][0] 内容为[2,0,-1,-1], “2”表示当前轮廓的后一个轮廓的编号为2,“0”表示当前轮廓的前一个轮廓编号为0,其后2
		个“-1”表示为空,因为只有最外层轮廓这一个等级,所以不存在父轮廓和内嵌轮廓。

	/* mode 定义轮廓的检索模式
	取值一:CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略

	取值二:CV_RETR_LIST   检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关
	系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,
	所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1

	取值三:CV_RETR_CCOMP  检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围
	内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层

	取值四:CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内
	层轮廓还可以继续包含内嵌轮廓。

	/* method 定义轮廓的近似方法
	取值一:CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内

	取值二:CV_CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours
	向量内,拐点与拐点之间直线段上的信息点不予保留

	取值三和四:CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近
	似算法
	/************************************************************************/
	findContours(edge, contour, hierarchy, RetrievalModes::RETR_TREE, ContourApproximationModes::CHAIN_APPROX_NONE);

	for (int index = 0; index >= 0;index = hierarchy[index][3])
	{
		Scalar color(0, 0,  255);
		// index 轮廓的索引号
		drawContours(matDraw, contour, index, color, FILLED , LineTypes::LINE_4, hierarchy);
	}
	//imwrite("Contours.bmp", matDraw);
}
void DrawingFunctions::Opencv_drawMarker(Mat &matDraw)
{
	// 在图像上绘制标记
	// MARKER_CROSS 绘制一个十字
	// MARKER_TILTED_CROSS 绘制一个倾斜十字
	// MARKER_STAR  绘制一个十字和倾斜交叉十字的组合
	// MARKER_DIAMOND 绘制一个菱形
	// MARKER_SQUARE 绘制一个正方形
	// MARKER_TRIANGLE_UP 绘制一个正向三角
	// MARKER_TRIANGLE_DOWN 绘制一个倒三角
	drawMarker(matDraw, Point(100, 100), Scalar(0, 0, 255), MarkerTypes::MARKER_STAR);
}
void DrawingFunctions::Opencv_ellipse(Mat &matDraw)
{
	// 绘制椭圆 
	// angle 椭圆旋转的角度
	// startAngle 椭圆弧度起始的角度
	// endAngle 椭圆的弧度结束的角度、
	// 注: 当endAngle - startAngle = 360 时绘制一个完整的椭圆,否则绘制的只是一段弧线.
	RotatedRect rRect = RotatedRect(Point2f(100, 100), Size2f(100, 50), 30);
	// 通过旋转的矩形绘制椭圆,得到的是一个完整的椭圆,不能随意绘制弧线
	ellipse(matDraw, rRect, Scalar(0, 0, 255));
	ellipse(matDraw, Point(100, 100), Size(79, 59), 30, 100, 360, Scalar(0, 0, 255));
	
}
void DrawingFunctions::Opencv_ellipse2Poly(Mat &matDraw)
{
	// 通过一条折线得到一条近似弧线
	// delta 越小,得到的弧线越平滑
	std::vector<Point> pt;
	ellipse2Poly(Point(100, 100), Size(79, 59), 30, 100, 360, 1, pt);
	// isClosed 绘制的弧线是否是封闭的,如果为false 不封闭,true封闭.
	polylines(matDraw, pt, false, Scalar(0, 0, 255));
}
void DrawingFunctions::Opencv_fillConvexPoly(Mat &matDraw)
{
	// 绘制一个凸多边形并用指定颜色填充凸多边形区域
	std::vector<Point> pt = std::vector<Point>{ Point(10,20),Point(200,20),Point(10,200),Point(200,200) };
	// points 构成凸多边形的点集
	// color 填充颜色
	fillConvexPoly(matDraw, pt, Scalar(0, 0, 255));
}
void DrawingFunctions::Opencv_fillPoly(Mat &matDraw)
{
	// 填充一个或多个多边形区域
	Point pt[2][4];
	pt[0][0] = Point(10, 20);
	pt[0][1] = Point(200, 20);
	pt[0][2] = Point(10, 200);
	pt[0][3] = Point(200, 200);

	pt[1][0] = Point(300, 300);
	pt[1][1] = Point(400, 300);
	pt[1][2] = Point(300, 500);
	pt[1][2] = Point(400, 500);
	const Point* ppt[2] = { pt[0],pt[1] };
	const int npt[2] = {4, 4};
	// points 构成凸多边形的点集
	// color 填充颜色
	fillPoly(matDraw, ppt, npt, 2,Scalar(0, 0, 255));
}
void DrawingFunctions::Opencv_line(Mat &matDraw)
{
	// 划线
	line(matDraw, Point(100, 100), Point(400, 400), Scalar(0, 0, 255));
}
void DrawingFunctions::Opencv_putText(Mat &matDraw)
{
	// 像图片添加文本
	putText(matDraw, "hello", Point(100, 100), HersheyFonts::FONT_HERSHEY_PLAIN, 12, Scalar(0, 0, 255));
}
void DrawingFunctions::Opencv_rectangle(Mat &matDraw)
{
	// 绘制矩形
	rectangle(matDraw, Point(100, 100), Point(400, 400), Scalar(0, 0, 255));
}
void DrawingFunctions::Opencv_getTextSize(Mat &matDraw)
{
	// 返回字符串的宽和高
	int *baseLine = new int();
	Size size = getTextSize("10000000000000", HersheyFonts::FONT_HERSHEY_PLAIN, 10, 1, baseLine);
	int n = sizeof(baseLine) / sizeof(int);
	printf("W: %d,H:%d,Num: %d", size.width, size.height, n);
}#include "stdafx.h"
#include "DrawingFunctions.



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: