OpenCV Mat模板代码从Windows移植到Ubuntu

时间:2014-11-04 03:58:54

标签: templates gcc ubuntu-14.04

这是我第二次遇到这个问题。以前,它已发布here并已修复。上一次,尝试Ubuntu Precise。我将我的系统更新到新的Ubuntu LTS 14.04并再次出现问题,旧修复似乎无法正常工作

template <class NumType> void drawCircles(cv::Mat& image, const cv::Mat_<cv::Vec<NumType, 2> > points, cv::Scalar color) 
{   

            Point2d p0;

            for (int i = 0; i < points.cols; i++)   
            {       
                 p0.x = cvRound(points.at<cv::Vec<NumType, 2> >(0, i)[0]);      
                 p0.y = cvRound(points.at<cv::Vec<NumType, 2> >(0, i)[1]);

                 circle(image, p0, 5, color, 2, 8);     
            } 
}

我尝试在here讨论的提示中添加模板关键字。具体做法是:

p0.x = cvRound(points.at<cv::template Vec<NumType, 2> >(0, i)[0]);

仍然没有帮助 原始错误是:

error: expected primary-expression before ‘>’ token

顺便说一句,这个相同的代码在Windows中使用VS2008或VS2010进行了彻底编译

谢谢!

1 个答案:

答案 0 :(得分:0)

我必须创建一个简单的例子来测试它。这没有任何用处,但它证明它编译好。你99%的路在那里。

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>

template <class NumType> 
void drawCircles(  cv::Mat& image, 
                   const cv::Mat_<cv::Vec<NumType, 2> > points, 
                   cv::Scalar color) 
{   

    // Added cv namespace
    cv::Point2d p0;

    for (int i = 0; i < points.cols; i++)   
    {
        // added template call to at rather than Vec
        p0.x = cvRound(points.template at<cv::Vec<NumType, 2> >(0, i)[0]);      
        p0.y = cvRound(points.template at<cv::Vec<NumType, 2> >(0, i)[1]);

        circle(image, p0, 5, color, 2, 8);     
    } 
}


int main(){

    cv::Mat image;
    cv::Mat_<cv::Vec2d> points;
    cv::Scalar color;


    drawCircles( image, points, color );

    return 0;
}