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
?
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.
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
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();
}
}
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 .