2012-07-16 49 views
4

的垫我想要访问未知类型的矩阵的元素:OpenCV的索引通过未知类型

for(int ii = 0; ii < origCols; ii++) 
{ 
    colIdx.at<img.type()>(0,ii) = ii+1; // make one based index 
} 

定义类型(<内部>)表达式必须是恒定的,所以上面的代码不起作用。有没有办法不只是在不同的图像类型转换做到这一点其他的?

回答

2

通过一些文档的寻找后,我不认为这是一个天然的OpenCV的方式做到这一点不回避分支。

如果你只是关心干净的代码,你可以尝试一个模板方法,只要你不介意的模板:

template <typename T> void dostuff(cv::Mat& colIdx, int origCols) 
{ 
    for(int ii = 0; ii < origCols; ii++) 
    { 
     colIdx.at<T>(0,ii) = (T)(ii+1); // make one based index 
    } 
} 

void dostuff_poly(cv::Mat& colIdx, int origCols) 
{ 
    switch(colIdx.type()) 
    { 
     case CV_8UC1: dostuff<char>(colIdx, origCols); break; 
     case CV_32FC1: dostuff<float>(colIdx, origCols); break; 
     case CV_64FC1: dostuff<double>(colIdx, origCols); break; 
     // and so on 
     default: 
    } 
} 

在这个例子中,代码是相当小的,所以模板看起来像它不会是一个坏的选择,会给你想要的多态性,而无需编写一堆冗余代码。

也许一些教程会给你一个更好的主意:

OpenCV docs: core module tutorials

OpenCV docs: How to scan images

1

没有本地opencv的解决问题的方法,这是一种常见的疼痛与此库。有三种可能的解决方案:

  1. 始终使用具有相同深度的矩阵。我想这不是你想听到的。
  2. 模板,通过基质中含有的元素的类型调用你的代码的方法:这只适用于单信道矩阵工作,因为.AT <的模板>方法必须由CV东西:: Point2f用于多个通道的矩阵。
  3. 创建一个“聪明”的迭代器类,将知道如何访问基于矩阵深度矩阵数据。喜欢的东西:

    class PtrMat 
    { 
        PtrMat(cv::Mat& mat, int row) 
        { 
        if(mat.depth() == CV_32F) { _ptr = new PtrFloat(mat, row); } 
        else if(mat.depth() == CV_8U) { _ptr = new PtrUchar(mat, row); } 
        ... 
        } 
        Ptr* _ptr 
    }; 
    
    class Ptr 
    { 
        virtual void set(const float& val)=0; 
    }; 
    class PtrFloat: public Ptr 
    { 
        PtrFloat(const cv::Mat& mat, int row){ _val = mat.ptr<float>(row); } 
        void set(const float& val) { _val = val; } 
        float* _val; 
    } 
    class PtrUchar: public Ptr 
    { 
        PtrUchar(const cv::Mat& mat, int row){ _val = mat.ptr<uchar>(row); } 
        void set(const float& val) { _val = val; } 
        uchar* _val; 
    } 
    

当然,与你结了大量的重复代码的第三个解决方案。浮法铸造也可以减缓你的循环。在这种情况下,解决方案并不完美。

+0

我认为托蒂以下的回答是什么,我想要做清洁,但是你做几个好点。感谢您的回应。这个组合帮助我确定了我将尝试的内容,这可能是基于模板的。 – zzzz 2012-07-19 16:48:01