我想访问未知类型矩阵的元素:
for(int ii = 0; ii < origCols; ii++)
{
colIdx.at<img.type()>(0,ii) = ii+1; // make one based index
}
定义类型的表达式(在&lt;&gt;内)必须是常量,因此上述代码不起作用。有没有办法做到这一点,而不仅仅是切换不同的图像类型?
答案 0 :(得分:4)
在查看了一些文档之后,我认为没有原生的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:
}
}
在这个例子中,代码相当小,所以模板似乎不是一个糟糕的选择,并且可以在不编写冗余代码的情况下为您提供所需的多态性。
也许其中一些教程会给你一个更好的主意:
答案 1 :(得分:1)
您的问题没有原生的Opencv解决方案,而且这个库经常出现问题。有三种可能的解决方案:
创建一个“智能”迭代器类,它将知道如何根据矩阵深度访问矩阵数据。类似的东西:
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;
}
当然,使用第三种解决方案,您最终会得到大量重复的代码。浮动铸造也可以减慢你的循环。在这种情况下,没有完美的解决方案。