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 データの連続性を理解することが不可欠です。ここではいくつかの重要なポイントを示します:
たとえば、次のコード スニペットでは:
<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 サイトの他の関連記事を参照してください。