• Qt中显示opencv的图像


    opencv中的图像类型是IplImage,Qt中是QImage

    必须要实现两者的转换!。

    注意。要记得调用opencv的cvWaitKey()函数。。。

    同时,Qt工程中要修改pro文件,添加如下信息:

    INCLUDEPATH += . /usr/local/include/opencv
    LIBS 
    += /usr/local/lib/libcv.so /
       
        /usr/local/lib/libcvaux.so /
       
        /usr/local/lib/libcxcore.so /
       
        /usr/local/lib/libhighgui.so /
       
        /usr/local/lib/libml.so

    函数:

    !!下列函数有错误!:

    ---------------------最后一个for循环-----------------

    for(int i = 0; i < 256; i++)
            {
                colorTable[i] = qRgb(i, i, i);
                vcolorTable[i] = colorTable[i];
            }

    -----------------------应该用vcolorTable的push_back函数-------------------

    for(int i = 0; i < 256; i++)
            {
                colorTable[i] = qRgb(i, i, i);
                vcolorTable.push_back(colorTable[i]);
            }

    _______________________________________________

    QImage MainWindow::IplImage2QImage(const IplImage *iplImage, double mini, double maxi) {
        uchar *qImageBuffer = NULL;

        int width = iplImage->width;

        /* Note here that OpenCV image is stored so that each lined is
        32-bits aligned thus
        * explaining the necessity to "skip" the few last bytes of each
        line of OpenCV image buffer.
        */
        int widthStep = iplImage->widthStep;
        int height = iplImage->height;

        switch (iplImage->depth)
        {
        case IPL_DEPTH_8U:
            if(iplImage->nChannels == 1)
            {
                /* OpenCV image is stored with one byte grey pixel. We convert it
                    to an 8 bit depth QImage.
                    */

                qImageBuffer = (uchar *) malloc(width*height*sizeof(uchar));
                uchar *QImagePtr = qImageBuffer;
                const uchar *iplImagePtr = (const uchar *) iplImage->imageData;

                for(int y = 0; y < height; y++)
                {
                    // Copy line by line
                    memcpy(QImagePtr, iplImagePtr, width);
                    QImagePtr += width;
                    iplImagePtr += widthStep;
                }

            }
            else if(iplImage->nChannels == 3)
            {
                /* OpenCV image is stored with 3 byte color pixels (3 channels).
                            We convert it to a 32 bit depth QImage.
                            */
                qImageBuffer = (uchar *) malloc(width*height*4*sizeof(uchar));
                uchar *QImagePtr = qImageBuffer;
                const uchar *iplImagePtr = (const uchar *) iplImage->imageData;
                for(int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        // We cannot help but copy manually.
                        QImagePtr[0] = iplImagePtr[0];
                        QImagePtr[1] = iplImagePtr[1];
                        QImagePtr[2] = iplImagePtr[2];
                        QImagePtr[3] = 0;

                        QImagePtr += 4;
                        iplImagePtr += 3;
                    }
                    iplImagePtr += widthStep-3*width;
                }

            }
            else
            {
                qDebug("IplImageToQImage: image format is not supported : depth=8U and %d channels ", iplImage->nChannels);
            }
            break;
                    case IPL_DEPTH_16U:
            if(iplImage->nChannels == 1)
            {
                /* OpenCV image is stored with 2 bytes grey pixel. We convert it
                    to an 8 bit depth QImage.
                    */
                qImageBuffer = (uchar *) malloc(width*height*sizeof(uchar));
                uchar *QImagePtr = qImageBuffer;
                //const uint16_t *iplImagePtr = (const uint16_t *);
                const unsigned int *iplImagePtr = (const unsigned int *)iplImage->imageData;
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        // We take only the highest part of the 16 bit value. It is
                        //similar to dividing by 256.
                        *QImagePtr++ = ((*iplImagePtr++) >> 8);
                    }
                    iplImagePtr += widthStep/sizeof(unsigned int)-width;
                }
            }
            else
            {
                qDebug("IplImageToQImage: image format is not supported : depth=16U and %d channels ", iplImage->nChannels);

            }
            break;
                    case IPL_DEPTH_32F:
            if(iplImage->nChannels == 1)
            {
                /* OpenCV image is stored with float (4 bytes) grey pixel. We
                    convert it to an 8 bit depth QImage.
                    */
                qImageBuffer = (uchar *) malloc(width*height*sizeof(uchar));
                uchar *QImagePtr = qImageBuffer;
                const float *iplImagePtr = (const float *) iplImage->imageData;
                for(int y = 0; y < height; y++)
                {
                    for(int x = 0; x < width; x++)
                    {
                        uchar p;
                        float pf = 255 * ((*iplImagePtr++) - mini) / (maxi - mini);
                        if(pf < 0) p = 0;
                        else if(pf > 255) p = 255;
                        else p = (uchar) pf;

                        *QImagePtr++ = p;
                    }
                    iplImagePtr += widthStep/sizeof(float)-width;
                }
            }
            else
            {
                qDebug("IplImageToQImage: image format is not supported : depth=32F and %d channels ", iplImage->nChannels);
            }
            break;
                       case IPL_DEPTH_64F:
            if(iplImage->nChannels == 1)
            {
                /* OpenCV image is stored with double (8 bytes) grey pixel. We
                        convert it to an 8 bit depth QImage.
                        */
                qImageBuffer = (uchar *) malloc(width*height*sizeof(uchar));
                uchar *QImagePtr = qImageBuffer;
                const double *iplImagePtr = (const double *) iplImage->imageData;
                for(int y = 0; y < height; y++)
                {
                    for(int x = 0; x < width; x++)
                    {
                        uchar p;
                        double pf = 255 * ((*iplImagePtr++) - mini) / (maxi - mini);

                        if(pf < 0) p = 0;
                        else if(pf > 255) p = 255;
                        else p = (uchar) pf;

                        *QImagePtr++ = p;
                    }
                    iplImagePtr += widthStep/sizeof(double)-width;
                }
            }
            else
            {
                qDebug("IplImageToQImage: image format is not supported : depth=64F and %d channels ", iplImage->nChannels);
            }
            break;
                    default:
            qDebug("IplImageToQImage: image format is not supported : depth=%d and %d channels ", iplImage->depth, iplImage->nChannels);
        }

        QImage qImage;
        QVector<QRgb> vcolorTable;
        if(iplImage->nChannels == 1)
        {
            // We should check who is going to destroy this allocation.
            QRgb *colorTable = new QRgb[256];
            for(int i = 0; i < 256; i++)
            {
                colorTable[i] = qRgb(i, i, i);
                vcolorTable[i] = colorTable[i];
            }
            qImage = QImage(qImageBuffer, width, height, QImage::Format_Indexed8).copy();
            qImage.setColorTable(vcolorTable);
        }
        else
        {
            qImage = QImage(qImageBuffer, width, height, QImage::Format_RGB32).copy();
        }
        free(qImageBuffer);
        return qImage;
    }

  • 相关阅读:
    合并两个有序链表
    有效括号方法二
    有效括号
    es6 中的模块化
    XMLHttpRequest 对象
    AST
    php读写文件方式
    vue开发中遇到的问题
    sublime操作
    cmd命令
  • 原文地址:https://www.cnblogs.com/muyuhu/p/2749807.html
Copyright © 2020-2023  润新知