1
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);
他们安全吗?
1)reinterpret_cast <>永远不会“安全”。 (2)get_pointer(src,row)中的指针数学对于非字节像素类型将失败。 (3)你知道cv :: Mat.ptr()方法吗?我认为他们做你想做的事 –
关于非字节像素类型,你的意思是像5-6-5(3个16位的通道,看起来像嵌入式设备上的漂亮命令)一些通道。我总是害怕类型在C++上进行转换,特别是reinterpret转换,但我不知道其他解决方案可以返回到上一行,如果我想通过指针运算来完成。感谢您的信息.ptr(),我已经改变了实现。 –
StereoMatching
5-6-5或16位无符号或浮点数。在用于计算之前,指针数学需要将reinterpret_cast <>应用于数据。我认为你不应该实现你自己的模板,直接使用cv :: Mat方法。不确定OpenCV如何处理5-6-5,tho。 –