ホームページ  >  記事  >  バックエンド開発  >  OpenCV でマット オブジェクトを配列またはベクトルに変換するには?

OpenCV でマット オブジェクトを配列またはベクトルに変換するには?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-26 13:48:02193ブラウズ

How to Convert a Mat Object to an Array or Vector in OpenCV?

OpenCV でのマットから配列への変換

OpenCV は、異なるデータ構造間で変換するためのさまざまな方法を提供します。この記事では、Mat オブジェクトから配列またはベクトルへの変換に焦点を当てます。

Mat から Array への直接変換

連続 Mat の場合、ここでデータはメモリに連続して保存されるため、そのデータに 1D 配列として直接アクセスできます。

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

2D 配列への変換

非連続マットの場合、そのデータを行ごとに取得し、2D 配列に保存できます。

<code class="cpp">cv::Mat mat;
// ...
std::vector<std::vector<uchar>> array(mat.rows);
for (int i = 0; i < mat.rows; ++i) {
    array[i] = std::vector<uchar>(mat.cols * mat.channels());
    array[i] = mat.ptr<uchar>(i);
}</code>

ベクトルへの変換

C 標準ライブラリのベクトルを使用する場合は、

<code class="cpp">cv::Mat mat;
// ...
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>

マット データの連続性

マットの連続性がデータ アクセスの効率に影響することは注目に値します。 imread()、clone()、またはコンストラクターによって作成された行列は、通常は連続です。逆に、より大きなマットの ROI (関心領域) から作成された行列は連続的ではない可能性があります。

このコード スニペットは、データの連続性の違いを示しています。

<code class="cpp">cv::Mat big_mat = cv::Mat::zeros(1000, 1000, CV_8UC3);
cv::Mat sub_mat = big_mat(cv::Rect(10, 10, 100, 100));

std::cout << "big_mat is continuous: " << big_mat.isContinuous() << std::endl; // true
std::cout << "sub_mat is continuous: " << sub_mat.isContinuous() << std::endl; // false</code>

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

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