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);
显示结果: