web-dev-qa-db-ja.com

opencv 3.0 BetaのファイルからUMatを読み取る方法は?

UMatを使用して、OpenCL(Op​​enCV 3.0.0 Beta)を使用してGPUとCPUの両方でコードを実行できるようにします。

しかし、画像ファイルをUMatに読み込んだり、MatUMatに変換したりする方法が見つかりません。

画像をUMatに読み込むにはどうすればよいですか?

12
mans

MatからUMatへの変換のサンプルを以下に示します。 Coudlntはこのためのドキュメントを見つけます。したがって、唯一のオプションは source を読み取ることでした。

UMat img = imread( "lena.jpg", IMREAD_COLOR  ).getUMat( ACCESS_READ );

source のような異なるアクセスフラグは

ACCESS_READ, ACCESS_WRITE, ACCESS_RW, ACCESS_FAST

UMatの使用法がわからない場合は、顔検出の完全なサンプルを利用できます ここ 。また、ドキュメントでは古いフラグがimread2番目のパラメータとして参照されていることにも注意してください。 OpenCVヘッダーファイルのように、新しいフラグを使用する必要がある場合があります。

16
Kiran

私のために働くのは...

cv::UMat image;
cv::imread("image.jpeg", 1).copyTo(image);

これは最新のopencv3.2を使用しています

2
JoeManiaci

秘密のために私は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();
     }
}
1
lexxai

ここで説明していることは正解ではないことに注意してください!

このプレゼンテーション (明らかに itseez の公式プレゼンテーション)によると、ファイルからcv::UMatに画像を直接ロードする正しい方法は次のとおりです。

UMat img;
imread( "lena.jpg", -1, img); // -1 => CV_LOAD_IMAGE_UNCHANGED (colourwise)

ただし、これはOpenCV 3インターフェースの一部ではないため、実際には Kiranの実装 を使用する必要があります。

0
Antonio