1.常用图形相关API解释(一般都有重载,下面只介绍每个其中一种)
(1)直线:void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
img: 要绘制线段的图像。
pt1::线段的起点。pt2: 线段的终点。
color::线段的颜色,通过一个Scalar对象定义。
thickness: 线条的宽度。
lineType: 线段的类型。可以取值8, 4, 和CV_AA, 分别代表8邻接连接线,4邻接连接线和反锯齿连接线。默认值为8邻接。为了获得更好地效果可以选用CV_AA(采用了高斯滤波)。
shift::坐标点小数点位数。
(2)椭圆:void cvEllipse( CvArr* img, CvPoint center, CvSize axes, double angle, double start_angle, double end_angle, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
img:图像。
center:椭圆圆心坐标。
axes:轴的长度。
angle:偏转的角度。
start_angle:圆弧起始角的角度。.
end_angle:圆弧终结角的角度。
color:线条的颜色。
thickness:线条的粗细程度。
line_type:线条的类型,一般用LINE_8。
shift:圆心坐标点和数轴的精度。
3.矩形:void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )
img:写入图像
rec:矩形样式
color:颜色
thickness:线条的粗细程度。
line_type:线条的类型,一般用LINE_8。
其中Rect为:void Rect(int x,int y,int width,int height)
x:起始点横坐标
y:起始点纵坐标
width:矩形宽度
height:矩形高度
4.圆形:void circle(CV_IN_OUT Mat& img, Point center, int radius, const Scalar& color, int thickness=1, int lineType=8, int shift=0);
img:输入图像,单通道多通道都可以
center:画圆的圆心坐标
radius:圆的半径
color:为设定圆的颜色
thickness:为设置圆线条的粗细,值越大则线条越粗,为负数则是填充效果
5.多边形:用于一个单独被多边形轮廓所限定的区域内进行填充。函数可以填充复杂的区域,例如,有漏洞的区域和有交叉点的区域等等。void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int contours,CvScalar color, int line_type=8, int shift=0 );
img:图像
pts:指向多边形的数组指针
npts:多边形的顶点个数的数组
contours:组成填充区域的线段的数量
color:多边形的颜色
line_type:组成多边形的线条的类型
shift:顶点坐标的小数点位数
6.添加文字:void putText( Mat& img, const string& text, Point org, int fontFace,double fontScale,Scalar color, int thickness=1, int lineType=8 );
img:写入图片
text:写入文字,字符串
org: 第一个字符左下角坐标
fontFace:字体类型,FONT_HERSHEY_SIMPLEX ,FONT_HERSHEY_PLAIN ,FONT_HERSHEY_DUPLEX 等
fontScale:字体大小
color:字体颜色
thickness:字体粗细
2.代码实现
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
Mat src;
void MyLine();//线条
void MyRect();//矩形
void MyEllipse();//椭圆
void MyCircle();//圆形
void MyPolygon();//多边形
int main()
{
char *title = "start Image";
src = imread("D:/demo.jpg");
if (src.empty())
{
cout << "无法打开图像文件!" << endl;
return -1;
}
MyLine();
MyRect();
MyEllipse();
MyCircle();
MyPolygon();
putText(src, "hello Opencv!", Point(150, 150), CV_FONT_HERSHEY_COMPLEX, 1.0, Scalar(125, 128, 255), 2, 8);
namedWindow(title, CV_WINDOW_AUTOSIZE);
imshow(title, src);
//RandomLineDemo();
waitKey(0);
return 0;
}
void MyLine()
{
Point p1(100, 100);
Point p2;
p2.x = 200;
p2.y = 200;
Scalar color = Scalar(255, 0, 0);
line(src, p1, p2, color, 5, LINE_8);
}
void MyRect()
{
Rect rect = Rect(100, 100, 100,100);
Scalar color = Scalar(0, 0, 255);
rectangle(src,rect,color,5,LINE_8);
}
void MyEllipse()
{
Scalar color = Scalar(0, 255, 0);
ellipse(src, Point(src.cols / 2, src.rows / 2), Size(src.cols / 4, src.rows / 8), 90, 0, 360, color, 4, LINE_8);//90,0,360分别表示倾斜度、起始终止角度
}
void MyCircle()
{
Scalar color = Scalar(255, 255, 255);
Point center = Point(src.cols / 2, src.rows / 2);
circle(src, center, 150, color, 4, LINE_AA);
}
void MyPolygon()//参数复杂
{
Point pts[1][5];
pts[0][0] = Point(60, 100);
pts[0][1] = Point(500, 200);
pts[0][2] = Point(200, 200);
pts[0][3] = Point(200, 100);
pts[0][4] = Point(100, 100);
const Point* ppts[] = { pts[0] };
int npt[] = { 5 };
Scalar color = Scalar(255, 50, 255);
fillPoly(src,ppts,npt,1,color,8);
}
3.结果