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 に答える