OpenCV マットを配列/ベクトルに変換する
問題:
OpenCV の初心者向け、適切な関数を見つけるMat を Array に変換するのは難しい場合があります。 .ptr や .at などの既存のメソッドでは、目的のデータ形式が提供されない可能性があります。
答え:
連続マット (すべてのデータが連続して保存される) の場合、データ1D 配列として直接取得できます:
<code class="cpp">std::vector<uchar> array(mat.rows * mat.cols * mat.channels()); if (mat.isContinuous()) array = mat.data;</code>
非連続マットの場合、データは行ごとに抽出する必要があり、結果は 2D 配列になります:
<code class="cpp">uchar **array = new uchar*[mat.rows]; for (int i = 0; i < mat.rows; ++i) array[i] = new uchar[mat.cols * mat.channels()]; for (int i = 0; i < mat.rows; ++i) array[i] = mat.ptr<uchar>(i);</code>
更新:
簡素化を図るため、std::vector の使用をお勧めします:
<code class="cpp">std::vector<uchar> array; if (mat.isContinuous()) { array.assign(mat.data, mat.data + mat.total() * mat.channels()); } else { for (int i = 0; i < mat.rows; ++i) { array.insert(array.end(), mat.ptr<uchar>(i), mat.ptr<uchar>(i) + mat.cols * mat.channels()); } }</code>
CV_8UC1 以外のデータ型 (CV_32F など) の場合は、適切なデータを使用してくださいベクトル定義を入力します。
更新 2:
マット データの連続性について:
以上がOpenCV Mat を配列またはベクトルに効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。