QPixmap fromImage 在从 cv::mat 转换的图像上给出了段错误
QPixmap fromImage gives segment fault on image converted from 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();
}
但是程序在没有任何调试日志的情况下崩溃了。我尝试了很多图像,结果都是一样的。我试图找到 "stack trace",但它似乎给出了段错误..
好的..只需将转换代码更改为
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)
我简化了代码,是这样的:
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();
}
但是程序在没有任何调试日志的情况下崩溃了。我尝试了很多图像,结果都是一样的。我试图找到 "stack trace",但它似乎给出了段错误..
好的..只需将转换代码更改为
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)