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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 14:08:03862ブラウズ

How do I efficiently convert an OpenCV Mat object to a C   array or vector?

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

OpenCV では、画像データへのアクセスと操作は、さまざまな画像処理タスクにとって重要です。一般的な要件の 1 つは、イメージまたは行列を表す Mat オブジェクトを配列またはベクトルに変換することです。

配列への変換

Mat オブジェクトのメモリの場合は連続的です。つまり、すべてのデータが連続して格納されます。次のコードを使用して 1D 配列を直接取得できます。

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

ここで、mat は Mat オブジェクト、array は変換された配列、.rows、.cols です。 、および .channels() は画像の寸法とチャネル数を表し、.data は画像データへのポインタです。

ベクトルへの変換

非連続マットの場合、データは行ごとに取得する必要があります。 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>

マット データの連続性

効率的な変換には Mat データの連続性を理解することが不可欠です。ここではいくつかの重要なポイントを示します:

  • imread()、clone()、またはコンストラクターを使用して作成されたマットは常に連続です。
  • マットはデータを借用する場合にのみ非連続になります。既存のマットから (単一の行または元の幅全体の複数の行を借用する場合を除く)。

たとえば、次のコード スニペットでは:

<code class="cpp">cv::Mat image = cv::imread("image.jpg"); // continuous Mat
cv::Mat sub_image = image(cv::Rect(100, 100, 100, 100)); // non-continuous Mat since it borrows data from `image`</code>

画像は連続画像です。 Mat は imread() を使用して作成されたため、sub_image は画像 Mat の一部を参照しているため非連続です。

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

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