2012-12-16 65 views
3

我有一些使用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); 

不過它不工作了: (

+0

這聽起來像你要像'的Point2D roundedElement(墊,行,列)',它會檢查什麼類型的函數它是矩陣,使用適當的'at '這種類型的方法,然後返回四捨五入的結果。這聽起來正確嗎? –

+0

@ Mr.Vaughn:我試圖用edit01 –

+0

來更清楚一些,你可以做這樣的事情,但是你需要檢查'points'的數據類型,然後調用drawCircles(img,Mat_ (points),c1 ),U是適當的類型。 –

回答

3

首先:您的設計似乎有點破碎給我。如果「點」不過是包含2D矢量的1×n矩陣,則用一個矢量代替它是更合適的。 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)); 
+0

@ Mr.Niko:你的代碼有效。我仍然想解決我的問題。我可以在函數頭/聲明中使用「const Mat_>點」嗎? Eclipse檢查這是一個錯誤。所以Mat不能作爲模板類型傳遞? –

+0

如果您傳遞該類型的對象而不是普通的「Mat」對象,那麼該工作方式也應該如此。你能對你得到的錯誤更具體嗎? – Niko

+0

謝謝!它現在適用於我。這只是我自己愚蠢的錯誤:D。現在我可以同時使用Mat_或InputArray –