我有一些使用OpenCV Mat的例程。這是其中之一:是否有訪問OpenCV元素的模板方法?
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);
不過它不工作了: (
這聽起來像你要像'的Point2D roundedElement(墊,行,列)',它會檢查什麼類型的函數它是矩陣,使用適當的'at'這種類型的方法,然後返回四捨五入的結果。這聽起來正確嗎? –
@ Mr.Vaughn:我試圖用edit01 –
來更清楚一些,你可以做這樣的事情,但是你需要檢查'points'的數據類型,然後調用drawCircles(img,Mat_ (points),c1 ),U是適當的類型。 –