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>
マット データの連続性を理解する
変換を効果的に実行するには、マット データの連続性を理解することが重要です。注意すべき重要な点は次のとおりです。
以上がOpenCV Mat を配列またはベクトルに効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。