C++ 在openCV的数据指针上进行类型转换

C++ 在openCV的数据指针上进行类型转换,c++,opencv,C++,Opencv,代码1 模板 内联T*get_指针(cv::Mat&src,int行) { 返回src.ptr(行); } 模板 内联T*get_指针(cv::Mat&src、int row、int col) { 返回get_指针(src,row)+col*src.channels(); } 模板 内联T*get_指针(cv::Mat&src、int行、int列、int通道) { 返回get_指针(src、row、col)+通道; } 代码2 template<typename T> inline

代码1

模板
内联T*get_指针(cv::Mat&src,int行)
{
返回src.ptr(行);
}
模板
内联T*get_指针(cv::Mat&src、int row、int col)
{
返回get_指针(src,row)+col*src.channels();
}
模板
内联T*get_指针(cv::Mat&src、int行、int列、int通道)
{
返回get_指针(src、row、col)+通道;
}
代码2

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;
}
cv::Mat input=/。。。。
auto*input\u ptr=获取指针(输入、行、列);
//返回上一行
输入\u ptr=重新解释\u cast(重新解释\u cast(输入\u ptr)-input.steps);
它们安全吗?

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

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);
为什么不改用这个(更短更安全的)代码呢

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_指针(src,row)中的指针数学将失败。(3) 您知道cv::Mat.ptr()方法吗?我想他们会做你想做的关于非字节像素类型的事情,你是说像5-6(3位有16位的通道,看起来像是嵌入式设备上的命令)之类的频道吗?我总是害怕C++上的类型转换,特别是重新解释的转换,但是我不知道如果我想通过指针运算,其他解决方案可以返回到前一行。感谢您提供的.ptr()信息,我已经更改了实现。5-6-5,或16位无符号,或浮点。指针数学在用于计算之前需要对数据应用reinterpret_cast。我认为您不应该实现自己的模板,而应该直接使用cv::Mat方法。不确定OpenCV如何处理5-6-5,tho.1)重新解释\u转换从来都不是“安全的”。(2)get\u指针(src,row)中的指针数学对于非字节像素类型将失败。(3) 您知道cv::Mat.ptr()方法吗?我想他们会做你想做的关于非字节像素类型的事情,你是说像5-6(3位有16位的通道,看起来像是嵌入式设备上的命令)之类的频道吗?我总是害怕C++上的类型转换,特别是重新解释的转换,但是我不知道如果我想通过指针运算,其他解决方案可以返回到前一行。感谢您提供的.ptr()信息,我已经更改了实现。5-6-5,或16位无符号,或浮点。指针数学在用于计算之前需要对数据应用reinterpret_cast。我认为您不应该实现自己的模板,而应该直接使用cv::Mat方法。不确定OpenCV如何处理5-6-5,tho。
T *ptr_to_elem = &src(row,col)[channel];