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

Susan Sarandon
リリース: 2024-10-27 03:32:30
オリジナル
232 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!