27_OpenCV绘制椭圆

发布时间:2024-06-17 15:01

cv::ellipse和cv::circle函数非常相似,主要的区别在于axes参数。函数声明:

bool ellipse(
	cv::Mat& img,  // image rto be drawn on
	cv::Point center,  // location of ellipse center
	cv::Size axes, // length of major and minor axes
	double angle,  // tilt angle of major axis
	double startAngle,  // start angle for arc drawing
	double endAngle,  // End angle for arc drawing
	const cv::Scalar& color,  // Color,BGR form
	int thickness = 1,  // thickness of line
	int lineType = 8,  // connectedness,4 or 8
	int shift = 0  // bits if radius to treat as fraction
);
bool ellipse(
	cv::Mat& img,
	const cv::RotatedRect& rect,  // image to be drawn on
	const cv::Scalar& color,  // Color,BGR form
	int thickness = 1,  // thickness of line
	int lineType = 8,  // connectedness,4 or 8
	int shift = 0  // bits of radius to treat as fraction
);

第一种函数声明说明:
参数axes是cv::Size类型的值,其中height和width参数分别表示椭圆长轴和短轴的长度。
参数angle是主轴的角度(单位为度),计算方法是从水平方向(x轴正方向)开始逆时针旋转。
参数startAngle和endAngle表示了圆弧的起始和中止角度,如果要得到一个完整的椭圆,这两个值要分别设置为0和360。

第二种画椭圆的方式是使用一个边界框,使用cv::RotatedRect类型的边界框就同时指定了椭圆的大小和朝向。

此外还有一个函数cv::ellipse2Poly()是在cv::ellipse()函数内部使用的,用来计算椭圆弧,但是也可以单独调用。函数声明原型:

void ellipse2Poly(
	cv::Point center,
	cv::Size axes,  // length of major and minor axes
	double angle,  // tilt angle of major axis
	double startAngle,  // start angle for arc drawing
	double endAngle,  // end angle for arc drawing
	int delta,  // angle between sequential vertices
	vector& pts  // result,STL-vector of points
);

给定一个椭圆弧参数,包括center,axes,angle,startAngle和endAngle,这些参数与cv::ellipse()中的定义相同,还有指定下一个采样点的角度delta参数。上面的参数设置后,cv::ellipse2Poly就可以计算出一系列的点,用以这些点作为顶点的多边形来近似指定的椭圆弧,计算的点使用vector<> pts返回。

使用示例:

	cv::Mat image(600, 800, CV_8UC3, cv::Scalar(0, 0, 0));
	cv::Point cenpt = cv::Point(150, 200);
	cv::Size siz = cv::Size(120, 80);
	double axes = 10;
	double startAngle = 60;
	double endAngle = 300;
	cv::ellipse(image, cenpt,siz, axes,startAngle,endAngle, CV_RGB(255, 0, 0),3);
	cenpt.x = 450;
	cenpt.y = 500;
	axes = 90;
	cv::RotatedRect rect(cenpt, siz, axes);
	cv::ellipse(image, rect, CV_RGB(0, 255, 0),3);
	cv::namedWindow("image");
	cv::imshow("image", image);
	cv::waitKey(0);

	std::vector pts;
	int delta = 30;
	cv::ellipse2Poly(cenpt, siz, axes, startAngle, endAngle, delta, pts);
	for (auto it = pts.begin(); it != pts.end(); ++it){
		std::cout << "pt = " << it->x << "," << it->y << std::endl;
	}

	int nsize = pts.size();
	for (int i = 0; i < nsize - 1; i++){
		cv::line(image, pts.at(i), pts.at(i + 1), CV_RGB(0, 255, 255), 5);
	}
	cv::namedWindow("image");
	cv::imshow("image", image);
	cv::waitKey(0);

显示结果:

27_OpenCV绘制椭圆_第1张图片27_OpenCV绘制椭圆_第2张图片

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号