如何从opencv 3.0 Beta中的文件中读取UMat?

时间:2014-12-12 14:07:26

标签: c++ opencv opencl

我想使用UMat,因此我的代码可以使用OpenCL(Op​​enCV 3.0.0 Beta)在GPU和CPU上运行。

但我找不到将图片文件读取到UMat或将Mat转换为UMat的方法。

如何将图像读入UMat

5 个答案:

答案 0 :(得分:16)

MatUMat转换的示例如下。 Coudlnt'为此找到文档。因此,唯一的选择是阅读source

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

source中的不同访问标记

ACCESS_READ, ACCESS_WRITE, ACCESS_RW, ACCESS_FAST

对于未使用的UMat用法,可以使用完整的人脸检测样本here。另请注意,文档仍将较旧的标志称为imread第二个参数。您可能需要在OpenCV头文件中使用较新的标志。

答案 1 :(得分:2)

对我有用的是......

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

这是使用最新的opencv 3.2

答案 2 :(得分:1)

对于隐蔽我使用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();
     }
}

答案 3 :(得分:0)

请注意,我在这里描述的不是正确答案!

根据this presentation(显然是来自itseez的官方文件),将文件从文件直接加载到cv::UMat的正确方法应如下:

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

但是,这不是OpenCV 3界面的一部分,因此您应该使用Kiran's implementation

答案 4 :(得分:-2)

您可以使用copyTo方法将(复制基础数据)cv :: Mat转换为cv :: UMat,反之亦然。

以下是使用cv::UMat的示例代码:

//VideoCapture tCapturer("2.avi"); // source is set to be the clip
VideoCapture tCapturer(0); // source is set to be the camera
UMat tUFrame;

if (!tCapturer.isOpened())
{
    cout << "Could not open video file!" << endl;
    getchar();
    return -1;
}
else
{
    cout << "Video file has been opened successfully!" << endl;
    getchar();
}

namedWindow("video", 1);

while (true)
{
    if (!tClip.read(tUFrame)) // get a new frame from camera
    {
        break;
    }

    Mat tRegularFrame;
    tUFrame.copyTo(tRegularFrame);

    imshow("video", tRegularFrame);

    if (waitKey(30) >= 0)
    {
        break;
    }
}