3

我有一些使用 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 不支持这一点。还是我遗漏了一些要点?

Edit02:这是我的尝试:

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);

还是不行:(

4

1 回答 1

3

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

但是,对您的尝试进行微小更改后,模板版本应该可以正常工作:

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));
于 2012-12-16T11:59:22.117 回答