1

代码 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);

他们安全吗?

4

1 回答 1

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];
于 2015-03-23T21:34:59.443 回答