comment faire pour convertir un opencv cv::Mat pour qimage
Je me demande comment convertir le OpenCV C++ standard de cv::Mat type de Qimage. J'ai été la recherche autour, mais n'avez pas de chance. J'ai trouvé un code qui convertit le IPlimage pour Qimage, mais ce n'est pas ce que je veux. Grâce
Vous devez vous connecter pour publier un commentaire.
Michal Kottman la réponse est valide et donner le résultat attendu pour certaines images, mais il va échouer sur certains cas. Voici une solution que j'ai trouvée à ce problème.
Différence est l'ajout d'img.l'étape de la partie. qt ne se plaignent sans elle, mais quelques images de ne pas s'afficher correctement sans elle. Espérons que cela aidera.
image2Draw_qt = QImage(image2Draw_mat->data.ptr, image2Draw_mat->cols, image2Draw_mat->rows, image2Draw_mat->step, QImage::Format_RGB888);
Également (environ, la ligne de 2400)cvConvertImage(mat, image2Draw_mat, CV_CVTIMG_SWAP_RB);
pour convertir BGR RVB.img.step
fait toute la différence. J'ai eu des problèmes bizarres avec cette conversion, y compris le résultat de l'image montrent déformée et avec de mauvaises couleurs. Les tests un peu j'ai eu le même code.Voici le code pour 24 bits RVB et niveaux de gris en virgule flottante. Facilement réglable pour d'autres types. Il est aussi efficace qu'il obtient.
Pour convertir
cv::Mat
àQImage
, vous pouvez essayer d'utiliser leQImage(uchar * data, int width, int height, Format format)
constructeur comme suit (mat
est uncv::Mat
) :Il est plus efficace que manuellement convertir les pixels de la
QImage
, mais vous devez garder à l'originecv::Mat
de l'image dans la mémoire. Il peut être facilement converti en unQPixmap
et affiché à l'aide d'unQLabel
:Mise à jour
Parce que OpenCV utilise BGR commande par défaut, vous devez d'abord utiliser
cvtColor(src, dst, CV_BGR2RGB)
pour obtenir un format d'image que Qt comprend.Mise à jour 2:
Si l'image que vous tentez d'afficher est non standard foulée (quand elle est non-continu, submatrix), l'image peut pu l'entendre déformée. Dans ce cas, il est préférable de spécifier explicitement la foulée à l'aide de
cv::Mat::step1()
:imread
, ou convertis en type approprié.OpenCV charge les images dans un
Mat
en Bleu-Vert-Rouge (BGR) format par défaut, alors queQImage
attend RVB. Cela signifie que si vous convertissez unMat
àQImage
, le bleu et le rouge canaux seront inversés. Pour résoudre ce problème, avant de construire laQImage
, vous avez besoin de changer le BRG format de votreMat
RVB, via lecvtColor
méthode utilisant l'argumentCV_BGR2RGB
, comme suit:Vous pouvez également utiliser
rgbSwapped()
sur leQImage
C'est ce qui a fonctionné pour moi. J'ai modifié Michal Kottman du code ci-dessus.
cv::Mat a un opérateur de conversion de IplImage, donc si vous avez quelque chose qui convertit le IplImage à une QImage, l'utiliser (ou de faire de l' - probablement mineur - des ajustements pour tenir le cv::Mat directement, la disposition de la mémoire est la même, c'est "juste" l'en-tête qui est différent.)
J'ai le même problème que toi, donc j'développer des quatre fonctions pour soulager ma douleur, ils sont
Ces fonctions peuvent manipuler les images 1, 3, 4 canaux, chaque pixel doit occuper un octet seulement(CV_8U->Format_Indexed8, CV_8UC3->QImage::Format_RGB888, CV_8UC4->QImage::Format_ARGB32), je ne traite pas avec d'autres types encore(QImage::Format_RGB16, QImage::Format_RGB666 et ainsi de suite). Les codes sont situés
au github.
La concepts clés de **transformer le tapis de Qimage ** sont
La concepts clés de transformer
cv::Mat to Qimage
sontSi serait bien si l'on peut étendre ces fonctions et de les rendre de soutien de plus en plus de types, veuillez m'en informer s'il y a des bugs.
Ce post montre comment convertir un
QImage
à OpenCV estIplImage
et vice-versa.Après, si vous avez besoin d'aide pour convertir entre
IplImage*
àcv::Mat
:C'est un hack, mais le travail sera fait.
Utiliser la fonction statique convert16uc1 pour la profondeur de l'image:
Il peut paraître idiot, mais l'enregistrement de l'image dans un dossier et ensuite la lecture dans un QImage objet me semblait le moyen le plus rapide.
Cela a fait l'affaire pour moi. C'est un peu douteux, a terrible de la performance (comme l'a fait remarquer dans les commentaires), mais fonctionne avec tous les formats de couleur j'ai jeté à elle jusqu'à présent, et il est également très simple à faire.
La procédure est comme suit:
Fait!
Si vous avez, disons, à l'afficher dans un QLabel, puis continuer avec:
Personnellement, j'utilise ceci pour un simple éditeur d'image.