web-dev-qa-db-fra.com

Comment lire UMat à partir d'un fichier ouvert Beta 3.0?

Je souhaite utiliser UMat pour que mon code puisse être exécuté à la fois sur le processeur graphique et sur le processeur à l'aide d'OpenCL (OpenCV 3.0.0 Beta).

mais je ne peux pas trouver un moyen de lire un fichier image dans un UMat ou de convertir un Mat en UMat.

Comment puis-je lire une image dans une UMat?

12
mans

L'échantillon pour la conversion de Mat à UMat est présenté ci-dessous. Coudlnt 'trouver de la documentation pour cela. Donc, seule option était de lire le source .

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

Différents indicateurs d'accès comme dans source are

ACCESS_READ, ACCESS_WRITE, ACCESS_RW, ACCESS_FAST

Pour comprendre la signification de UMat, un échantillon complet est disponible pour la détection des visages ici . Notez également que la documentation fait toujours référence aux anciens indicateurs en tant que imread second paramètre. Vous devrez peut-être utiliser des indicateurs plus récents comme dans votre fichier d'en-tête OpenCV.

16
Kiran

Ce qui fonctionne pour moi c'est ...

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

Ceci utilise la dernière opencv 3.2

2
JoeManiaci

Pour dissimulé j'utilise Uimage.copyTo(image) ou image=Uimage.getMat(cv::ACCESS_READ) mais dernier dans certains cas, générer un problème avec la réaffectation des données.

Si vous souhaitez utiliser UMat globalement pour tous, vous pouvez assister à certaines limitations de l’utilisation de UMat. Et il est peut-être préférable d'avoir la méthode de réservation avec Mat si l'opération avec UMat a une erreur de violation d'accès.

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

Notez que ce que je décris ici n’est PAS une réponse correcte!

Selon cette présentation (apparemment une officielle de itseez ), la manière correcte de charger une image à partir d'un fichier directement dans un cv::UMat devrait être la suivante:

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

Cependant, cela ne fait pas partie de l'interface OpenCV 3, vous devriez donc vraiment utiliser l'implémentation de Kiran .

0
Antonio