2016-05-23 12 views
3

Я хочу преобразовать изображение из cvMat типа в Qimage, с моим фактическим кодом приложение не работает; я сделал это по-другому (Qimage к Mat это работает отлично) скажите, пожалуйста, что происходит не так с моим кодомот cvMat до QImage

вот мой код для QImage в Мат:

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; 
} 

и вот мой код Мат для 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); 
} 

спасибо по заранее

+0

'Mat rgb' выходит за пределы области действия и * удаляется * в конце функции. Скопируйте данные изображения или конвертируйте их из 'mat', который живет дольше. – SpamBot

+0

вы можете отправить объяснение, как мне копировать данные – ner

+0

Или, дешевое решение, создайте 'Mat * rgb' с' new'. – SpamBot

ответ

4

, как @SpamBot упоминалось, данные освобождается, когда Mat выходит из области видимости. попробуйте выполнить глубокое копирование данных:

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

Это не работает, я думаю, что есть проблема с используемым форматом – ner

+0

любое сообщение об ошибке или образцы изображений артефактов? – Micka

+0

это приложение запросило время выполнения, чтобы закончить его необычным способом – ner