opencv Drawing Functions 全部函数使用说明

来源:互联网 发布:js正则判断数字 编辑:程序博客网 时间:2024/06/05 20:15
#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);}