大宇私人领地伊甸园丨宁愿做了后悔,也不要错过后悔[www.mrdayu.com]
注册

24小时联系邮箱:[email protected]

所有文章
大宇私人伊甸园: 首页 > 所有文章 > 编程人生 > 开源库 > opencv > [001.08]绘制形状与文字

[001.08]绘制形状与文字

发布时间:2018/07/12 opencv 标签opencv阅读:78

绘制形状与文字:

使用cv::Pointcv::Scalar:

Point表示2D平面上一个点x,y

Point p;

p.x = 10;

p.y = 8;

or

p = Pont(10,8);

Scalar表示四个元素的向量

Scalar(a, b, c);// a = blue, b = green, c = red表示RGB三个通道

绘制线、矩形、园、椭圆等基本几何形状:

画线 cv::line (LINE_4\LINE_8\LINE_AA)

画椭圆cv::ellipse

画矩形cv::rectangle

画圆cv::circle

画填充cv::fillPoly

填充矩形:

可以通过多边形填充来填充矩形

随机数生成cv::RNG

生成高斯随机数gaussian (double sigma)

生成正态分布随机数uniform (int a, int b)

绘制添加文字:

putText函数 中设置fontFace(cv::HersheyFonts),

fontFace, CV_FONT_HERSHEY_PLAIN

fontScale , 1.0, 2.0~ 8.0

演示代码:

效果图:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;
Mat bgImage;
const char* drawdemo_win = "draw shapes and text demo";
void MyLines();
void MyRectangle();
void MyEllipse();
void MyCircle();
void MyPolygon();
void RandomLineDemo();
int main(int argc, char** argv) {
	bgImage = imread("D://test.jpg");
	if (!bgImage.data) {
		printf("could not load image...\n");
		return -1;
	}
	//MyLines();
	//MyRectangle();
	//MyEllipse();
	//MyCircle();
	//MyPolygon();

	//putText(bgImage, "Hello OpenCV", Point(300, 300), CV_FONT_HERSHEY_COMPLEX, 1.0, Scalar(12, 23, 200), 3, 8);
	//namedWindow(drawdemo_win, CV_WINDOW_AUTOSIZE);
	//imshow(drawdemo_win, bgImage);

	RandomLineDemo();
	waitKey(0);
	return 0;
}

void MyLines() {
	Point p1 = Point(20, 30);
	Point p2;
	p2.x = 400;
	p2.y = 400;
	Scalar color = Scalar(0, 0, 255);
	line(bgImage, p1, p2, color, 1, LINE_AA);
}

void MyRectangle() {
	Rect rect = Rect(200, 100, 300, 300);
	Scalar color = Scalar(255, 0, 0);
	rectangle(bgImage, rect, color, 2, 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, 150, color, 2, 8);
}

void MyPolygon() {
	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[] = { pts[0] };
	int npt[] = { 5 };
	Scalar color = Scalar(255, 12, 255);

	fillPoly(bgImage, ppts, npt, 1, color, 8);
}

void RandomLineDemo() {
	RNG rng(12345);
	Point pt1;
	Point pt2;
	Mat bg = Mat::zeros(bgImage.size(), bgImage.type());
	namedWindow("random line demo", CV_WINDOW_AUTOSIZE);
	for (int i = 0; i < 100000; i++) {
		pt1.x = rng.uniform(0, bgImage.cols);
		pt2.x = rng.uniform(0, bgImage.cols);
		pt1.y = rng.uniform(0, bgImage.rows);
		pt2.y = rng.uniform(0, bgImage.rows);
		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
		if (waitKey(50) > 0) {
			break;
		}
		line(bg, pt1, pt2, color, 1, 8);
		putText(bg, "dangTao", pt1, CV_FONT_HERSHEY_COMPLEX, 1.0, color, 3, 8);
		imshow("random line demo", bg);
	}
}

代码中之所以使用面向过程编程是为了用更突出的方式来将精力关注文中最重要的知识点,而不是面向对象方面的各种“骚操作”。

其他:

opencv之line:

void cvLine( CvArr* img,CvPoint pt1, CvPoint pt2, CvScalar color,int thickness=1, int line_type=8, int shift=0 );

第一个参数img:要划的线所在的图像;

第二个参数pt1:直线起点

第二个参数pt2:直线终点

第三个参数color:直线的颜色 e.g:Scalor(0,0,255)

第四个参数thickness=1:线条粗细

第五个参数line_type=8,

第六个参数:坐标点的小数点位数。

opencv之eclipse:

void cv::Ellipse( 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:线条的类型,见CVLINE的描述。

第十个参数shift:圆心坐标点和数轴的精度。

opencv之circle:

void cv::Circle( CvArr* img, CvPoint center, int radius, CvScalar color,
               int thickness=1, int line_type=8, int shift=0 );

第一个参数img:图像。

第二个参数center:圆心坐标。

第三个参数radius:圆形的半径。

第四个参数color:线条的颜色。

第五个参数thickness:如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充。

第六个参数line_type:线条的类型。见 cvLine 的描述

第七个参数shift:圆心坐标点和半径值的小数点位数。

The bottom line, for me, is simple.

Let’s hope it doesn’t take 500 years for a discipline of testing to becomes the standard for software developers.

From:dayu
相关推荐

您好!请登录

合作网站快捷登录:
点击取消回复

已有1评论

    大宇博客

    点击这里给我发消息 点击这里给我发消息 点击这里给我发消息 点击这里给我发消息