Я нашел очень похожую тему: how to convert an opencv cv::Mat to qimage, но это не решает мою проблему.cv :: Mat to QImage conversion
У меня есть функция преобразования резюме :: Mat в QImage
QImage cvMatToQImg(cv::Mat& mat)
{
cv::Mat rgb;
if(mat.channels()==1)
{
cv::cvtColor(mat,rgb,CV_GRAY2BGR);
cv::cvtColor(rgb,rgb,CV_BGR2BGRA);
QImage temp = QImage((unsigned char*)(rgb.data), rgb.cols,
rgb.rows,QImage::Format_ARGB32);
QImage returnImage = temp.copy();
return returnImage;
}
И это работает для моих, но я хочу, чтобы сделать его более эффективным. Во-первых: почему изменение 2 cvtColor функции с:
cv::cvtColor(mat,rgb,CV_GRAY2BGRA)
терпит неудачу на
QImage returnImage = temp.copy()
с Segfault.
Тогда как устранить копирование QImage. Когда я просто возвращаю временное изображение, я получаю segfault.
Любые другие оптимизации могут быть выполнены там? Это очень часто используемая функция, поэтому я хочу сделать ее как можно быстрее.
Вы не указали формат изображения 'mat', это даже 24-битное изображение в оттенках серого? – cmannett85
В основном я работаю с 8-битным оттенком серого. Но чем больше дел справляется, тем лучше. – krzych
Нет необходимости копировать. QImage - общий указатель. Segfauld происходит не из-за копирования, а из-за неправильного выравнивания. Аналогичный конструктор QImage указывает дополнительно байты на строку - используйте это. P.S: найдено по googling: http://code.google.com/p/qt-opencv-multithreaded/source/browse/trunk/src/MatToQImage.cpp?r=75 –