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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-10-27 03:32:30360ブラウズ

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

OpenCV でマットを配列またはベクトルに変換する

OpenCV の行列演算では、マットを配列またはベクトルに変換する必要がある場合があります。 。この記事では、OpenCV の堅牢な機能を利用して、このような変換を実現するための包括的なガイドを提供します。

配列への直接変換

Mat オブジェクト マットが連続メモリを所有している場合、そのデータは1D 配列として直接取得できます:

<code class="cpp">std::vector<uchar> array(mat.rows * mat.cols * mat.channels());
if (mat.isContinuous())
    array = mat.data;</code>

行ベースの配列への変換

メモリが連続していない場合、データは行で取得できます

<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 を使用すると、Mat を配列に変換するための代替アプローチが提供されます。

<code class="cpp">std::vector<uchar> array;
if (mat.isContinuous()) {
    // array.assign(mat.datastart, mat.dataend); // May cause issues for sub-matrices
    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_32F などの他のデータ型を持つ OpenCV Mats の場合、変換プロセスは同様です。

<code class="cpp">std::vector<float> array;
if (mat.isContinuous()) {
    // array.assign((float*)mat.datastart, (float*)mat.dataend); // May cause issues for sub-matrices
    array.assign((float*)mat.data, (float*)mat.data + mat.total() * mat.channels());
} else {
    for (int i = 0; i < mat.rows; ++i) {
        array.insert(array.end(), mat.ptr<float>(i), mat.ptr<float>(i) + mat.cols * mat.channels());
    }
}</code>

マット データの連続性を理解する

変換を効果的に実行するには、マット データの連続性を理解することが重要です。注意すべき重要な点は次のとおりです。

  • imread()、clone()、またはコンストラクターを通じて作成されたマットは本質的に連続です。
  • データの不連続は、マットがデータを借用する場合にのみ発生します。既存のマット (元の幅全体が含まれる特定のシナリオを除く)。

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

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