UMat
を使用して、OpenCL(OpenCV 3.0.0 Beta)を使用してGPUとCPUの両方でコードを実行できるようにします。
しかし、画像ファイルをUMat
に読み込んだり、Mat
をUMat
に変換したりする方法が見つかりません。
画像をUMat
に読み込むにはどうすればよいですか?
Mat
からUMat
への変換のサンプルを以下に示します。 Coudlntはこのためのドキュメントを見つけます。したがって、唯一のオプションは source を読み取ることでした。
UMat img = imread( "lena.jpg", IMREAD_COLOR ).getUMat( ACCESS_READ );
source のような異なるアクセスフラグは
ACCESS_READ, ACCESS_WRITE, ACCESS_RW, ACCESS_FAST
UMat
の使用法がわからない場合は、顔検出の完全なサンプルを利用できます ここ 。また、ドキュメントでは古いフラグがimread
2番目のパラメータとして参照されていることにも注意してください。 OpenCVヘッダーファイルのように、新しいフラグを使用する必要がある場合があります。
私のために働くのは...
cv::UMat image;
cv::imread("image.jpeg", 1).copyTo(image);
これは最新のopencv3.2を使用しています
秘密のために私はUimage.copyTo(image)
またはimage=Uimage.getMat(cv::ACCESS_READ)
を使用しますが、最後にデータの再割り当てで問題が発生する場合があります。
すべての人にUMat
をグローバルに使用したい場合は、UMat
の使用にいくつかの制限があります。また、Mat
を使用した操作でアクセス違反エラーが発生した場合は、UMat
を使用した予約メソッドを使用することをお勧めします。
clearReadyResultImage();
qDebug()<<"vpOpenCV::blurImage, try GPU cv::blur";
try{
cv::blur(Uimage, UresultImage, cv::Size(ksize, ksize));
UresultImageReady=!UresultImage.empty();
}
catch (cv::Exception& ex) {
qWarning()<<"vpOpenCV::blurImage error"<<ex.what();
}
if (!UresultImageReady) {
checkReadyImage();
qDebug()<<"vpOpenCV::blurImage, try CPU cv::blur";
try{
cv::blur(image, resultImage, cv::Size(ksize, ksize));
resultImageReady=!resultImage.empty();
}
catch (cv::Exception& ex) {
qWarning()<<"vpOpenCV::blurImage error"<<ex.what();
}
}
...
void checkReadyImage(){
if (!imageReady && UimageReady){
Uimage.copyTo(image);
imageReady=!image.empty();
}
}
ここで説明していることは正解ではないことに注意してください!
このプレゼンテーション (明らかに itseez の公式プレゼンテーション)によると、ファイルからcv::UMat
に画像を直接ロードする正しい方法は次のとおりです。
UMat img;
imread( "lena.jpg", -1, img); // -1 => CV_LOAD_IMAGE_UNCHANGED (colourwise)
ただし、これはOpenCV 3インターフェースの一部ではないため、実際には Kiranの実装 を使用する必要があります。