c++ - 在opencv和c++中画西门子星

标签 c++ opencv visual-c++ drawing

我是 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)); 结果如下:

enter image description here

请注意,这可能不是您想要的(因为中心的光学效果并不真正可见),但我认为这就是光栅化(绘图期间)的问题。我们在这里不使用 vector 图像。如果减少元素的数量可能会更好......

关于c++ - 在opencv和c++中画西门子星,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23326724/

相关文章:

c++ - 处理不同类中的整数时如何修复 'read access violation'异常

c++ - 从 SURF 描述符转换为关键点

c++ - 获取存储在矩阵中的图像的 ROI 的平均 R、G 和 B

c++ - 相同方法签名的模板化和显式参数类型版本

visual-studio - 将 tinyxml2 与 Visual Studio、Visual C++ MFC 应用程序一起使用

c++ - 实现与 float 一起使用的自定义 atomic_add()

c++ - 在程序终止前加入线程

c++ - Clang 格式不正确的字符编码问题

c# - 内存泄漏问题。使用 OpenCVSharp 在 Unity 中进行眼动追踪

visual-c++ - 向 CDialog 窗口添加工具栏