#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.