0
をコピーせずにベクトル私は、この関数ました:変換品種::マットはstdする::
void foo(cv::Mat &mat){
float *p = mat.ptr<float>(0);
//modify mat values through p
}
をそして、私は関数を呼び出す、このコードがあります。しかし
void bar(std::vector<unsigned char> &vec){
//...
cv::Mat res(m, n, CV_32FC1, (void *)&workspace.front());
}
、上記のコードをパフォーマンスの問題があります。vec
はおそらく整列していません。実際には、インテルコンパイラはreference *out has unaligned access
と言っています。これが理由だと思う。
Btw、私がthisで見つけたように、cv::Mat
が整列しようとしています。だから、簡単な回避策がすることです:あなたが想像できるようにcv::Mat res(m,n)
foo(m);
m.ptr<float>(0)
にvec
ポインタを割り当て
- を作成し、ここでのパフォーマンスは非常に重要なので、ディープコピーです質問から外れています。
私はthis問題のコードを試みた:
vec = res.data;
をしかし、私は、コンパイラのエラーを取得します。さらに、私は上記のコードが(非効率な)コピーを行うかどうかわからない、または指示されたデータを
vec
で変更するだけです。これをどのようにスムーズに行うことができますか?そうしないと、別の回避策が理解できます。
感謝を取る、私はこれは要素のではなく、参照の深いコピーを実行するために起こっている(そしてそれは非効率的になる)ことを恐れています、右?言い換えると、これは線形になります。 – cplusplusuberalles
申し訳ありませんが、私は注意を払っていませんでした。多分プレーンなポインタ配列かもしれません。私は友人にもオープンCVで働いている人に尋ねました。彼は同じ方向を指していました。 – BlooB