/*
*绘制形状与文字
cv::Point数据结构:代表了一个点的坐标,一个二维点的坐标
Point表示2D平面上一个点x, y
Point p;
p.x = 10;
p.y = 8;
or
p = Point(10, 8);
cv::Scalar数据结构:代表颜色的向量,RGB色彩空间经常是数有三个值或者灰度图像赋给一个值
Scalar表示四个元素的向量,基类是Vec向量这个类
总共有四个元素构造函数的可以声明一个,两个,三个, 四个都可以,不能超过四个,零个也可以,然后再给它赋值也可以
Scalar(a, b, c); a = blue, b = green, c = red 表示RGB三个通道
绘制线、矩形、圆、椭圆等基本几何图形
画线cv::line (LINE_4\LINE_8\LINE_AA) 有一个参数是linetype 就是绘制线的类型 其中类型LINE_AA表示反锯齿 就是绘制线和几何形状的圆、椭圆等
画椭圆cv::ellipse
画矩形cv::rectangle
画圆cv::circle
画填充cv::fillPoly
随机生成线与绘制文本
*/
#include
#include
using namespace cv;
using namespace std;
//定义全局变量
Mat bgImage;
const char* drawdemo_win = "drawdemo window";
//定义一个方法,函数声明
void MyLine(); //画一条线
void MyRectangle();//画一个矩形
void MyEllipse(); //绘制一个椭圆
void MyCircle(); //画一个圆
void MyPolygen(); //多边形的填充功能
void RandomLineDemo(); //画一个随机的线
int main(int argc, char** argv)
{
bgImage = imread("D:/A_Graduation/picture/Fusion/source17_1.tif");
if (!bgImage.data)
{
printf("Could not load image src1...\n");
return -1;
}
//函数调用
MyLine();
MyRectangle();
MyEllipse();
MyCircle();
MyPolygen();
//RandomLineDemo();
// 字的位置 字体类型 字体大小 字体线的厚度
putText(bgImage, "Hello OpenCV", Point(30, 30), CV_FONT_HERSHEY_COMPLEX, 1.0, Scalar(0, 0, 255), 3, 8);
char input_win[] = "input image";
namedWindow(input_win, CV_WINDOW_AUTOSIZE);
imshow(input_win, bgImage);
waitKey(0);
return 0;
}
//函数实现
void MyLine()
{
Point p1 = Point(20, 30);
Point p2;
p2.x = 300;
p2.y = 300;
Scalar color = Scalar(0, 0, 255); //红色
line(bgImage, p1, p2, color, 2, LINE_AA); //thickness越大线越宽,lineType默认是8即LINE_8
}
void MyRectangle()
{
Rect rect = Rect(20, 10, 30, 30); //参数分别表示起始位置、宽、高
Scalar color = Scalar(255, 0, 0); //蓝色
rectangle(bgImage, rect, color, 3); //参数分别表示背景图像,矩形,颜色,线宽,线的类型默认是LINE_8
}
void MyEllipse()
{
Scalar color = Scalar(0, 255, 0);
ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols/4, bgImage.rows/8), 90, 0, 360, color, 2, LINE_8);
//参数分别表示背景图像, 椭圆的中心,椭圆的半径,椭圆的长轴和短轴,椭圆的倾斜程度,椭圆的起始角度、终止角度、椭圆线的颜色、线的宽度,线的类型
}
void MyCircle()
{
Scalar color = Scalar(0, 255, 255);
Point center = Point(bgImage.cols / 2, bgImage.rows / 2); //圆心的位置
circle(bgImage, center, 20, color, 2, 8); //参数分别表示背景图像,圆心位置,半径长度,线的颜色,线宽,线的类型
}
void MyPolygen()
{
//声明多边形的点的坐标,声明一个二维的,fillploy接收的是一个二维的指针
Point pts[1][5];
pts[0][0] = Point(100, 100);
pts[0][1] = Point(100, 200);
pts[0][2] = Point(200, 200);
pts[0][3] = Point(200, 100);
pts[0][4] = Point(100, 100);
const Point* ppts[1] = { pts[0] };
int npt[] = { 5 };
fillPoly(bgImage, ppts, npt, 1, Scalar(0, 255, 255), 8);
//ppts:折线中拐点坐标指针;npt:折线拐点个数指针;1:就画一个,对应pts的1
//这里有一篇我觉得解释的挺好的博客 http://blog.csdn.net/yinkailin/article/details/12406975
}
void RandomLineDemo()
{
Mat bg = Mat::zeros(bgImage.size(), bgImage.type());
//学习随机数这个类生成随机数,生成随机的颜色
//首先要有一个随机数生成的种子
RNG rng(12345);
//生成线的位置,定义两个点
Point pt1, pt2;
for (int i = 0; i < 100000; i++)
{
pt1.x = rng.uniform(0, bgImage.cols); //生成一个uniform的随机数,不要超过背景图的范围
pt1.y = rng.uniform(0, bgImage.rows);
pt2.x = rng.uniform(0, bgImage.cols);
pt2.y = rng.uniform(0, bgImage.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); //生成随机颜色,随机数在0-255之间
line(bg, pt1, pt2, color, 1, 8);
namedWindow("RandomLine Window", CV_WINDOW_AUTOSIZE);
imshow("RandomLine Window", bg);
if (waitKey(50) > 0) //50毫秒绘制一次
{
break;
}
/*
waitKey(x);
参数x: 等待x ms,如果在此期间有按键按下,则立即结束并返回按下按键的ASCII码,否则返回-1
如果x=0,那么无限等待下去,直到有按键按下
*/
}
}