2016-05-23 2 views
3

Je veux convertir une image du type cvMat à Qimage, avec mon code actuel, l'application ne fonctionne pas; Je l'ai fait dans l'autre sens (Qimage à Mat fonctionner très bien) s'il vous plaît me dire ce qui se passe mal avec mon codede cvMat à QImage

voici mon code pour Qimage à Mat:

Mat qimage2mat(const QImage& qimage) { 
    cv::Mat mat = cv::Mat(qimage.height(), qimage.width(), CV_8UC4, (uchar*)qimage.bits(), qimage.bytesPerLine()); 
    cv::Mat mat2 = cv::Mat(mat.rows, mat.cols, CV_8UC3); 
    int from_to[] = { 0,0, 1,1, 2,2 }; 
    cv::mixChannels(&mat, 1, &mat2, 1, from_to, 3); 
    return mat2; 
} 

et voici mon code pour Mat à Qimage

QImage mat2qimage(const Mat& mat) { 
    Mat rgb; 
    cvtColor(mat, rgb, CV_BGR2RGB); 
    return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888); 
} 

merci par avance

+0

'Mat rgb' sort du périmètre et est * effacé * à la fin de la fonction. Copiez les données d'image ou convertissez à partir de 'mat', qui vit plus longtemps. – SpamBot

+0

pouvez-vous envoyer expliquer comment puis-je copier les données – ner

+0

Ou, solution pas cher, créer un 'Mat * rgb' avec' new'. – SpamBot

Répondre

4
comme @SpamBot mentionné

, les données est libéré lorsque Mat est hors de portée. essayez de copier les données en profondeur:

QImage mat2qimage(const Mat& mat) 
{ 
    Mat rgb; 
    cvtColor(mat, rgb, CV_BGR2RGB); 
    return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888).copy(); 
} 
+0

cela ne fonctionne pas, je pense qu'il y a un problème avec le format utilisé – ner

+0

un message d'erreur ou des exemples d'artefacts d'image? – Micka

+0

cette application a demandé le temps d'exécution pour le terminer d'une manière inhabituelle – ner