我有一些使用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的元素类型无关?
谢谢
Edit01:
如果它像
那样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);
仍然没有成功:(
答案 0 :(得分: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));