在IplImage上绘制一个二次圆弧

时间:2011-10-22 02:38:06

标签: opengl opencv draw quadratic

我目前有一个使用opencv修改过的iplimage。我需要绘制一个像二次方程的抛物线那样的弧,我无法使用opencv中内置的基本绘图函数制作一个弧。我一直在研究opengl,但我能找到的都是bezier曲线。什么是最好的库来实现这个目标?

3 个答案:

答案 0 :(得分:0)

我不建议转到OpenGL(基于你在帖子中提供的内容)。

如果你想采用一种简单的方法,你可以逐点求解二次方程(即假设x是自变量,然后求解y)。一旦知道了x和y,就可以在指定的点绘制颜色。我在下面提供了一个片段,说明了在OpenCV中为像素着色的方法。按照原样使用此代码:它对我有用,但它没有考虑任何抗锯齿,透明度,子像素精度等。

void overlay(IplImage *o, const IplImage *m, const CvScalar &color)
{
  CvSize size = cvGetSize(o);

  unsigned char *p1 = NULL;
  unsigned char *p2 = NULL;

  for (size_t r=0;r<size_t(size.height);r++)
    for (size_t c=0;c<size_t(size.width);c++)
      {
        p1 = cvPtr2D(m, r, c);
        if (p1[0] == 255)
          {
            p2 = cvPtr2D(o, r, c);

            p2[0] = color.val[0];   // R
            p2[1] = color.val[1];   // G
            p2[2] = color.val[2];   // B
          }
      }
}

或者,您可以使用 OpenCV的Bezier曲线支持第三方库来支持OpenCV中的Bezier曲线。我过去曾尝试this one。通过一点计算,您可以使用加权Bezier曲线表示任意圆锥曲线。看一下维基百科页面底部附近的Rational Bezier曲线部分:Bezier Curve

答案 1 :(得分:0)

我在this页面上找到了this。它有效,我相信如果我无法弄清楚如何将iplimage转换为过剩的东西我可以在opencv中应用这个算法,因为它与上面提到的 非常相似。

答案 2 :(得分:0)

OpenCV cvEllipse就是您所需要的。请注意如何使用参数。

cvEllipse(CvArr * img,CvPoint center,CvSize axes,double angle,double startAngle,double endAngle,CvScalar color,int thickness = 1,int lineType = 8,int shift = 0)