2

会社のプロジェクトにパフォーマンスのアップグレードを実装しようとしています。このプロジェクトは OpenCV に依存しており、最近、UMat を使用するために OpenCV 3.1 に正常にアップグレードしました。基本的な操作を除いて、完全なチュートリアルは見つかりませんが。だから私は次のことで立ち往生しています:

Mat m (width, height, type, someData, step);
cv::UMat * ptr = new cv::UMat (width, height, type);
//dont ask me why the hell we are using a pointer to the smart mat object (my project leader insists)

これは機能しません

ptr->setTo (m);

これもありません:

m.copyTo(*ptr);

これらは例外を引き起こします。

ptr=&m.getUMat(cv::ACCESS_RW);

そして、これは 0 行と 0 列の 2 次元マットになります...助けが必要です。前もって感謝します!!!!

4

2 に答える 2

0

cv::setTo()MatからUMatにデータをコピーするためではなく、Matオブジェクトをスカラーに設定するために使用されます。これは、あなたがやろうとしていると私が信じていることです。

m.copyTo(*ptr)私にはうまくいきます:

int width=2;
int height=width;
int someData [4] {1,2,3,4};
int type=CV_32S;

cv::Mat m (width, height, type, someData, width*sizeof(int));
cv::UMat * ptr = new cv::UMat (width, height, type);
cv::UMat out;

m.copyTo(*ptr);

cv::multiply(*ptr,*ptr, out);

out.copyTo(m);

std::cout<<m<<std::endl; // [1, 4; 9, 16]

ptr=&m.getUMat(cv::ACCESS_RW);getUMat() によって生成された一時的な UMat オブジェクトのアドレスを取得して、それを ptr に割り当てようとしています。このオブジェクトは、この呼び出しの後、存在しなくなります。さらに、new() によって生成された UMat オブジェクトへの参照が失われます。

代わりに次のことを考慮してください。

*ptr=m.getUMat(cv::ACCESS_RW);
于 2018-09-06T14:03:27.180 に答える
0

次のように初期化する方が良いと思いますcv::UMat

cv::UMat* ptr = new cv::UMat(m.getUMat(cv::ACCESS_READ));
std::cout << "ptr = " << std::endl << ptr->getMat(cv::ACCESS_RW) << std::endl;

この方法では、サイズとタイプを手動で設定する必要はありません。また、ポインターを使用する必要がある場合は、std::unique_ptrまたは などの便利な C++11 機能の使用を検討してstd::shared_ptrください。

于 2016-04-14T02:09:20.793 に答える