我想访问一个未知类型的矩阵元素:
for(int ii = 0; ii < origCols; ii++)
{
colIdx.at<img.type()>(0,ii) = ii+1; // make one based index
}
表达式定义的类型(在<>中)必须是常量,因此上述代码无法工作。除了在不同的图像类型之间切换之外,还有其他的方法可以做到这一点吗?
在查看了一些文档后,我认为没有本地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 没有本地解决方案,这是该库经常出现的痛点。有三种可能的解决方案:
创建一个“智能”迭代器类,它将根据矩阵深度知道如何访问矩阵数据。例如:
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;
}