我是 opencv 的新手。我应该在 c++ 和 opencv 中实现一个西门子之星 ( http://upload.wikimedia.org/wikipedia/commons/5/50/Siemens_star.svg )。经过几天的互联网搜索,我感到非常沮丧,希望您能帮助我。我不知道如何开始。我实现它的第一个想法是从中心绘制填充三角形并用圆圈裁剪它们。但是我觉得opencv里面没有画三角形的函数。我的第二种方法是绘制两个 vector 之间的所有点,但我的数学知识很差(比如我的英语,抱歉 ;))。 请帮助我..
谢谢!
最佳答案
这就是使用 cv::ellipse
的方法:
cv::Mat siemensStar(unsigned int radius, unsigned int number_of_pieces)
{
// create output image
cv::Mat star(2*radius, 2*radius, CV_8UC1, 255);
// center in the middle of the image
cv::Point2f center(radius,radius);
// angle of a single arc (mind that there is always one black and one white arc
float angle = 360.0f/(2*(float)number_of_pieces);
// draw all arcs
for(float i=0; i<360; i+=2*angle)
{
// draw the outlines anti-aliased or change the line type if you want
cv::ellipse(star, center, cv::Size(radius,radius), 0, i, i+angle, cv::Scalar(0),-1, CV_AA);
}
return star;
}
这行得通,并通过调用 cv::imshow("siemens star", siemensStar(256,16));
结果如下:
请注意,这可能不是您想要的(因为中心的光学效果并不真正可见),但我认为这就是光栅化(绘图期间)的问题。我们在这里不使用 vector 图像。如果减少元素的数量可能会更好......
关于c++ - 在opencv和c++中画西门子星,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23326724/