Ну, это имеет смысл, поскольку IplImage2QImage()
не является ни частью Qt, ни OpenCV.
Вы, вероятно, видели, что эта функция используется где-то в Интернете и копируется / вставляется в ваш код.
С помощью простого поиска в Google я нашел реализацию этой функции:
static QImage IplImage2QImage(const IplImage *iplImage)
{
int height = iplImage->height;
int width = iplImage->width;
if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 3)
{
const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
QImage img(qImageBuffer, width, height, QImage::Format_RGB888);
return img.rgbSwapped();
} else if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 1){
const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
QImage img(qImageBuffer, width, height, QImage::Format_Indexed8);
QVector<QRgb> colorTable;
for (int i = 0; i < 256; i++){
colorTable.push_back(qRgb(i, i, i));
}
img.setColorTable(colorTable);
return img;
}else{
qWarning() << "Image cannot be converted.";
return QImage();
}
}
Надеюсь, вы будете знать, что с ней делать.
Я написал этот минимальный пример, чтобы показать, как успешно использовать IplImage2QImage()
.Он использует cvLoadImage()
для загрузки файла с именем test.jpg с диска и затем отображает его на QLabel.Это просто и работает!
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <QtGui>
#include <QImage>
static QImage IplImage2QImage(const IplImage *iplImage)
{
int height = iplImage->height;
int width = iplImage->width;
if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 3)
{
const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
QImage img(qImageBuffer, width, height, QImage::Format_RGB888);
return img.rgbSwapped();
}
else if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 1)
{
const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
QImage img(qImageBuffer, width, height, QImage::Format_Indexed8);
QVector<QRgb> colorTable;
for (int i = 0; i < 256; i++)
{
colorTable.push_back(qRgb(i, i, i));
}
img.setColorTable(colorTable);
return img;
}
else
{
std::cout << "Image cannot be converted.";
return QImage();
}
}
int main(int argc, char** argv)
{
QApplication app(argc, argv);
IplImage* img = cvLoadImage("test.jpg", 1);
if (!img)
{
std::cout << "Failed to load test.jpg";
return -1;
}
QImage qt_img = IplImage2QImage(img);
QLabel label;
label.setPixmap(QPixmap::fromImage(qt_img));
label.show();
return app.exec();
}
На моем компьютере с Linux я скомпилировал его:
g++ qimage.cpp -o qimage -I/usr/local/include/opencv -I/usr/local/include -I/opt/qt_47x/include -I/opt/qt_47x/include/QtGui -L/usr/local/lib -L/opt/qt_47x/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lQtCore -lQtGui