【发布时间】: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<T>方法,然后返回四舍五入的结果。听起来对吗? -
@Mr.Vaughn:我试着用edit01 让它更清楚
-
你可以这样做,但是你需要检查
points的数据类型,然后调用drawCircles(img,Mat_(points),c1),U是合适的类型。