QPixmap fromImage дает ошибку сегмента на изображении, преобразованном из cv::mat
Я упростил код, и это так:
Mat mat = imread("xxx.jpg"); //Successfully read the image, confirmed by cvShowImage.
if (mat.empty())
{
qDebug() << "Couldn't load image";
return;
}
Mat cpy = mat.clone();
cvtColor(mat,cpy,CV_BGR2RGB);
QImage image(cpy.data, cpy.cols, cpy.rows, cpy.step, QImage::Format_RGB888);
try {
pm = QPixmap::fromImage(image); //crash line
} catch(std::exception const &ex){
qDebug()<<ex.what();
}
однако программа просто потерпела крах без какого-либо журнала отладки. Я перепробовал много изображений, и результат тот же. Я попытался найти "трассировку стека", и, кажется, дать Segfault на этом..
1 ответ
Решение
Хорошо.. просто измените код конвертации на
QImage image(cpy.data, cpy.cols, cpy.rows, cpy.step, QImage::Format_RGB888);
image = image.rgbSwapped();
решил это. На самом деле я не знаю, почему это исправило это. Может быть, потому что я должен использовать COLOR_BGR2RGB, а не CV_BGR2RGB..
Был похожий сбой в QPixmap.fromImage. Найден обходной путь, изменив размер изображения до 4 байтов
aligned = cv2.resize(img, (img.shape[1]//4*4, img.shape[0]//4*4), fx=0, fy=0, interpolation=cv2.INTER_NEAREST)
rgb = cv2.cvtColor(aligned, cv2.COLOR_BGR2RGB)
qimage = QImage(rgb.data, rgb.shape[1], rgb.shape[0], QImage.Format_RGB888)
pixmap = QPixmap.fromImage(qimage)