【问题标题】:is there a template-method to access OpenCV element?是否有访问 OpenCV 元素的模板方法?
【发布时间】:2012-12-16 19:59:22
【问题描述】:

我有一些使用 OpenCV Mat 的例程。这是其中之一:

void drawCircles(Mat& image, const Mat points, Scalar color)
{
    // fix format of Matrix <-> hard coding

    //MatInfo(points);
    //getchar();

    CV_Assert(points.channels() == 2);
    //CV_Assert(points.depth() == CV_32FC2); // this is so restricted!!

    //CV_Assert(points.channels() == 2);
    //CV_Assert(points.depth() == CV_16UC2); 

    // added working for both row/col point vector

    Point2d p0;

    for (int i = 0; i < points.cols; i++)
    {   
        //p0.x = cvRound(points.at<Vec2i>(0,i)[0]);
        //p0.y = cvRound(points.at<Vec2i>(0,i)[1]);

        p0.x = cvRound(points.at<Vec2f>(0,i)[0]);
        p0.y = cvRound(points.at<Vec2f>(0,i)[1]);

        //p0.x = cvRound(points.at<Vec2d>(0,i)[0]);
        //p0.y = cvRound(points.at<Vec2d>(0,i)[1]);

        circle(image, p0, 5, color, 2, 8);
    }
}

用于在给定点的图像上绘制圆圈。

我可以通过 matrixA.at(i,j) 访问 Mat 的元素。然而,这太具体了。当矩阵的元素类型不同时,该功能将无法工作。 在这种情况下是否可以编写某种模板函数?哪个与Mat的元素类型无关??

谢谢

编辑01:

如果是这样的

template <class T> 
void drawCircles(Mat_<T> img, const Mat points, Scalar cl)
{
  ..
  img.at<T>() = something;
  ..
}

那就完美了。但是我已经使用 OpenCV 文档进行了搜索,并且认为 OpenCV MAT 不支持这一点。还是我遗漏了一些要点?

编辑02: 这是我的尝试:

template <class Type>
void drawCircles(Mat& image, const Mat_<Vec<Type, 2> > points, Scalar color)
{

    for (int i = 0; i < points.cols; i++)
    {
        p0.x = cvRound(points.at<Vec<Type, 2>>(0,i)[0]);
        p0.y = cvRound(points.at<Vec<Type, 2>>(0,i)[1]);

        circle(image, p0, 5, color, 2, 8);
    }
}

我称之为:

drawCircles(frame, Points, Scalar(255, 255, 255));

点在哪里:

Mat Points = Mat(1, 5, CV_32FC2, 0);

还是不行:(

【问题讨论】:

  • 听起来你想要一个像Point2d roundedElement(mat,row,col) 这样的函数,它检查它是什么类型的矩阵,使用该类型的适当at&lt;T&gt; 方法,然后返回四舍五入的结果。听起来对吗?
  • @Mr.Vaughn:我试着用edit01 让它更清楚
  • 你可以这样做,但是你需要检查points的数据类型,然后调用drawCircles(img,Mat_(points),c1),U是合适的类型。

标签: opencv mat


【解决方案1】:

首先:你的设计对我来说似乎有点坏了。如果“点”只不过是一个包含 2D 向量的 1xn 矩阵,那么使用向量代替会更合适,例如std::vector&lt;Point2f&gt;.

但是,对您的尝试稍作改动后,模板化版本应该可以正常工作:

template <typename T>
void drawCircles(InputArray _image, InputArray _points, Scalar color)
{
    Mat images = _image.getMat(), points = _points.getMat();
    CV_Assert(points.channels() == 2);

    for (int i = 0; i < points.cols; i++) {
        Vec<T,2>& v = points.at<Vec<T,2>>(0,i);

        Point2i p;
        p.x = cvRound(v[0]);
        p.y = cvRound(v[1]);

        circle(image, p, 5, color, 2, 8);
    }
}

// Usage:
drawCircles<float>(frame, Points, Scalar(255, 255, 255));

【讨论】:

  • @Mr.Niko:您的代码有效。我仍然想解决我的问题。我可以在函数头/声明中使用“const Mat_> points”吗? Eclipse 将此检查为错误。所以Mat不能作为模板类型传递??
  • 如果您传递该类型的对象而不是普通的“Mat”对象,那应该也可以工作。你能更具体地说明你得到的错误吗?
  • 谢谢!它现在对我有用。这只是我自己的愚蠢错误:D。现在我可以同时使用 Mat_ 或 InputArray
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 2014-07-25
  • 2016-01-04
相关资源
最近更新 更多