2013-03-29 17 views
1

码1类型转换上的OpenCV数据指针

template<typename T> 
inline T* get_pointer(cv::Mat &src, int row) 
{ 
    return src.ptr<T>(row); 
} 

template<typename T> 
inline T* get_pointer(cv::Mat &src, int row, int col) 
{ 
    return get_pointer<T>(src, row) + col * src.channels(); 
} 

template<typename T> 
inline T* get_pointer(cv::Mat &src, int row, int col, int channel) 
{ 
    return get_pointer<T>(src, row, col) + channel; 
} 

码2

cv::Mat input = //.... 
auto *input_ptr = get_pointer<float>(input, row, col); 
//back to previous row 
input_ptr = reinterpret_cast<float*>(reinterpret_cast<uchar*>(input_ptr) - input.steps); 

他们安全吗?

+0

1)reinterpret_cast <>永远不会“安全”。 (2)get_pointer(src,row)中的指针数学对于非字节像素类型将失败。 (3)你知道cv :: Mat.ptr()方法吗?我认为他们做你想做的事 –

+0

关于非字节像素类型,你的意思是像5-6-5(3个16位的通道,看起来像嵌入式设备上的漂亮命令)一些通道。我总是害怕类型在C++上进行转换,特别是reinterpret转换,但我不知道其他解决方案可以返回到上一行,如果我想通过指针运算来完成。感谢您的信息.ptr (),我已经改变了实现。 – StereoMatching

+0

5-6-5或16位无符号或浮点数。在用于计算之前,指针数学需要将reinterpret_cast <>应用于数据。我认为你不应该实现你自己的模板,直接使用cv :: Mat方法。不确定OpenCV如何处理5-6-5,tho。 –

回答

1

为什么不使用这个(更短,更安全)的代码呢?

T *ptr_to_elem = &src.at<T>(row,col)[channel]; 

这也适用于非连续数组。没有潜在的危险reinterpret_cast<>需要。这里唯一的安全条件是您知道数据类型T.更安全的版本是当您使用cv::Mat_<T>而不是cv::Mat时,以便在编译时捕获错误,而不是在运行时崩溃程序。

T *ptr_to_elem = &src(row,col)[channel];