QImage 和 IplImage 之间转换问题

来源:互联网 发布:java红包分配算法代码 编辑:程序博客网 时间:2024/05/21 09:50
QImage 和 IplImage 之间转换问题:

常用方法:

这个对于IplImage向QImage转换是一个非常重要的功能!
因为我们可以用下面的语句直接从IplImage构造QImage, 避免重复复制数据.

彩色图像:

IplImage *img = cvLoadImage("lena.jpg", 1);
QImage qImage(img->imageData, img->width, img->height,img->widthStep, QImage::Format_RGB888);

灰度图像:

IplImage *pImg2 = cvCreateImage(cvGetSize(pImg),8,1);

QImage qimage((unsigned char * )pImg2->imageDataOrigin,pImg2->width,pImg2->height,QImage::Format_Indexed8);

如果在显示 单通道灰度图 时,图像错位(斜偏移),

1、这时可以把 单通道  转为 3通道 图。如下:


外部输入 disp 为   单通道CvMat矩阵

IplImage   img,  *pImg;
pImg    =   cvGetImage(   disp,     &img   );
IplImage    *pImg2   =   cvCreateImage(  cvGetSize(pImg),  8,  3);
  cvCvtColor(   pImg,    pImg2,     CV_GRAY2BGR );
  QImage    qimage( (unsigned char * )pImg2->imageDataOrigin,    pImg2->width,   pImg2->height, QImage::Format_RGB888/*QImage::Format_Indexed8*/); //图像会错位

2、在初始化qimage 时,加上widthstep,如 上面彩色图像的转换。结果如下:

QImage qimage( (unsigned char * )pImg->imageDataOrigin, pImg->width, pImg2->height, pImg->widthStep, QImage::Format_Indexed8);

在 Qt 中显示:

int main ( int argc,   char *argv[] )

{

        QApplication app(argc, argv);
        QWidget *window = new QWidget;
        window->setWindowTitle("Enter your age");

     //  QImage-------〉QPixmap-------〉QLabel

       QLabel *label = new QLabel;

       QPixmap lpmap;

      label->setPixmap(lpmap.fromImage(qimage,0));

      QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(  label  );
        window->setLayout(  layout  );
        window->show(); 
        return app.exec();

}