的垫我想要访问未知类型的矩阵的元素:OpenCV的索引通过未知类型
for(int ii = 0; ii < origCols; ii++)
{
colIdx.at<img.type()>(0,ii) = ii+1; // make one based index
}
定义类型(<内部>)表达式必须是恒定的,所以上面的代码不起作用。有没有办法不只是在不同的图像类型转换做到这一点其他的?
的垫我想要访问未知类型的矩阵的元素:OpenCV的索引通过未知类型
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;
}
当然,与你结了大量的重复代码的第三个解决方案。浮法铸造也可以减缓你的循环。在这种情况下,解决方案并不完美。
我认为托蒂以下的回答是什么,我想要做清洁,但是你做几个好点。感谢您的回应。这个组合帮助我确定了我将尝试的内容,这可能是基于模板的。 – zzzz 2012-07-19 16:48:01