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

Linda Hamilton
リリース: 2024-10-26 14:08:03
オリジナル
783 人が閲覧しました

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

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