Как читать UMat из файла в opencv 3.0 Beta?
Я хочу использовать UMat
, чтобы мой код можно было запускать как на GPU, так и на CPU с помощью OpenCL (бета-версия OpenCV 3.0.0).
но я не могу найти способ прочитать файл изображения в UMat
или преобразовать Mat
в UMat
.
Как я могу прочитать изображение в UMat
?
Ответы
Ответ 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;
}
}