Подтвердить что ты не робот

Как читать UMat из файла в opencv 3.0 Beta?

Я хочу использовать UMat, чтобы мой код можно было запускать как на GPU, так и на CPU с помощью OpenCL (бета-версия OpenCV 3.0.0).

но я не могу найти способ прочитать файл изображения в UMat или преобразовать Mat в UMat.

Как я могу прочитать изображение в UMat?

4b9b3361

Ответ 1

Образец для преобразования Mat в UMat приведен ниже. Coudlnt 'найдет для этого документацию. Поэтому единственным вариантом было прочитать источник.

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

Различные флаги доступа, как в источнике,

ACCESS_READ, ACCESS_WRITE, ACCESS_RW, ACCESS_FAST

Для использования без использования UMat здесь доступен полный образец для обнаружения лиц . Также обратите внимание, что документация по-прежнему относится к старым флагам как imread второй параметр. Возможно, вам придется использовать новые флаги, как в вашем заголовочном файле OpenCV.

Ответ 2

Для скрытых я использую Uimage.copyTo(image) или image=Uimage.getMat(cv::ACCESS_READ), но последний в некоторых случаях генерирует проблему с переназначением данных.

Если вы хотите, чтобы ti использовал 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

Что работает для меня...

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

Используется последний opencv 3.2

Ответ 4

Обратите внимание, что то, что я описываю здесь, НЕ является правильным ответом!

В соответствии с эта презентация (по-видимому официальная из itseez) правильный способ загрузки изображения из файла непосредственно в cv::UMat должен быть следующим:

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

Однако это не является частью интерфейса OpenCV 3, поэтому вы действительно должны использовать реализацию Kiran.

Ответ 5

Вы можете преобразовать (скопировать базовые данные) cv:: Mat в cv:: UMat и наоборот с помощью метода copyTo.

Вот пример кода, который использует 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;
    }
}