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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 14:12:29247ブラウズ

How to Convert an OpenCV Mat to an Array or Vector?

OpenCV Mat を配列/ベクトルに変換する

OpenCV では、Mat オブジェクトからデータを取得することは初心者にとって難しい場合があります。この記事では、マットを配列またはベクトルに変換するプロセスについて説明します。

直接変換

マットのメモリが連続的であれば、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 を使用した簡略化されたアプローチ

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>

データ連続性に関する考慮事項

マット データの連続性により、すべてのデータがメモリ内で連続していることが保証されます。

  • Imread()、clone()、およびコンストラクターで作成されたマットは常に連続しています。
  • 非連続マットは、既存のマット (行/列の選択など) からデータを借用して生成されます。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。