ホームページ > バックエンド開発 > C++ > OpenCV Mat を配列またはベクトルに効率的に変換するにはどうすればよいですか?

OpenCV Mat を配列またはベクトルに効率的に変換するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-10-29 08:21:30
オリジナル
412 人が閲覧しました

How to Efficiently Convert OpenCV Mat to Array or Vector?

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:

マット データの連続性について:

  • imread()、clone(
  • 非連続マットは、借用したデータが元の行列で連続している場合 (単一行または全幅行など) を除き、既存の行列からデータを借用する場合にのみ発生します。

以上がOpenCV Mat を配列またはベクトルに効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート