6

OpenCVでMat​​のデータにアクセスする方法が気になります。ご存知のように、さまざまな方法でアクセスしてデータを取得できます。画像 (幅 x 高さ x 深さ 1) を Mat に保存し、画像内の各ピクセルにループ アクセスしたいと考えています。ptr<>(irow) を使用して行ピクセルを取得し、行の各列にアクセスするのが最善の方法ですか? または at<>(irow,jcol) を使用するのが最適ですか? または index = irow*Width + jrow を使用してインデックスを直接計算するのが最適ですか? 理由は誰でも知っています。

前もって感謝します

4

4 に答える 4

4

ここのドキュメントで情報を見つけることができます:基本的な画像コンテナと画像をスキャンする方法

OpenCVまたはC言語タイプの地獄の経験がない場合は、 atここで)練習することをお勧めします。しかし、タイプチェックを回避するため、最速の方法ptrNolwennの回答です。

于 2013-01-11T12:15:20.387 に答える
2

公式ドキュメントによると、最も効率的な方法は、最初に行へのポインターを取得してから、単純な C 演算子 [] を使用することです。また、反復ごとに乗算を保存します。

// compute sum of positive matrix elements
// (assuming that M isa double-precision matrix)
double sum=0;
for(int i = 0; i < M.rows; i++)
{
    const double* Mi = M.ptr<double>(i);
    for(int j = 0; j < M.cols; j++)
        sum += std::max(Mi[j], 0.);
}
于 2015-05-07T08:04:57.193 に答える
2

at<T>はすべての呼び出しで範囲チェックを行うため、 より遅くなりますptr<T>が安全です。

そのため、範囲計算が正しいと確信していて、可能な限り最高の速度が必要な場合は、 を使用してptr<T>ください。

于 2013-01-11T12:03:45.417 に答える