から作成する場合のように、データをコピーせずに、つまりヘッダーだけを作成することなく、すべてのベクトルが同じ幅であるから作成することは可能cv::Mat
ですか?std::vector<std::vector<T>>
cv::Mat
std::vector<T>
インターフェイスでSTLタイプのみを使用し、それらを基盤となるOpenCV関数に渡すことができるラッパーがあります。前後の過度の変換は避けたいと思います。
一般的に、いいえ。各内部 std::vector の相対的なメモリ位置について保証することはできません。cv::Mat は、すべてのメモリが連続的であるか、各行間に予測可能なジャンプが必要です。データの先頭へのポインターを 1 つだけ格納し、内部ベクトルにアクセスするには、各ベクトルのポインターが必要です。
何らかの形で記憶が連続していることを保証できる場合は、そうできます。
本当に探しているのが効率である場合は、このコンストラクターの使用に基づいて作業する必要があります。
// C++:
Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)¶
このコンストラクターはデータをコピーしません。これは、非効率性がありそうな場所です。したがって、ネストされたベクトルを使用する代わりに、すべてのデータを含む単一のベクトルを使用します。
ベクター内のデータの有効期間は、行列にアクセスするのに十分でなければならないことに注意してください。つまり、ベクターのサイズを変更すると、基になるデータが無効になる可能性があるため、&v[0]
.
一般的なコードでの使用が許可されている場合はboost::matrix
、問題が解決する可能性があります。