Qt - преобразовать пустой указатель (необработанные данные) в QImage и отобразить его на метке - PullRequest
0 голосов
/ 04 июля 2018

Я получаю доступ к камере через USB, используя библиотеку от производителя. Я получаю информацию об изображении через структуру:

typedef struct
{
    /*! Buffer handle which contains new data. */
    BUFF_HANDLE hBuffer;    

    /* Pointer to the beginning of the image datas (including MetaDatas(1024 bytes) if any) */
    void * pDatas; 

    /*! Total Buffer Payload size in bytes (including image, MetaDatas(1024 bytes) and additional bytes required by USB3 protocol */
    size_t iImageSize;

    /*! Width of the image (not including metadata) */
    size_t iImageWidth;

    /*! Height of the image */
    size_t iImageHeight;

    /*! Pixel Type */
    tImagePixelType eImagePixelType;

    /*! Line Pitch: corresponds to the number of bytes between two consecutive lines
      \note if MetaDatas are not activated, Line Pitch is equal to iImageWidth*eImagePixelType
      \note else MetaDatas are located immediately after the number of bytes corresponding to iImageWidth*eImagePixelType
    */
    size_t iLinePitch;

    /*! Buffer BlockId */
    unsigned long long iBlockId;

    ...

} tImageInfos;

Вся имеющаяся у меня информация об изображении взята из tImageInfos struct comments, так что теперь есть дополнительная информация в других местах. Из tImagePixelType я знаю, что тип пикселя изображения равен 12 bit: Mono12:

/*! Image Pixel Type */
typedef enum
{
    ...
    /*! Pixel Type 12 bit: Mono12 */
    eMono12   = 3
} tImagePixelType;

Моя цель - отобразить изображение на QLabel, но сначала я должен использовать необработанные данные (pData) и превратить их в изображение.

При моем текущем подходе я просто получаю отображаемые полосы, возможно из-за неправильной обработки исходных данных Процедура происходит в функции-члене класса QMainWindow:

void TragVisMain::setImageAndShowPicture(QString message, tImageInfos imageInfos)
{
    // Some message
    addMessageLineToLogOutput(message);

    // Create image from raw data
    QImage *img = new QImage(
                (uchar *) imageInfos.pDatas, 
                static_cast<int>(imageInfos.iImageWidth), 
                static_cast<int>(imageInfos.iImageHeight), 
                QImage::Format_Mono
    );

    ui->logOutput->appendPlainText(
        QString("image infos: [ height: %1, width: %2, iLinePitch: %3, adress: %4 ]")
        .arg(
                    // image height
                    QString::number(img->height()),

                    // output width
                    QString::number(img->width()),

                    // iLinePitch
                    QString::number(imageInfos.iLinePitch),

                    // address of pData
                    QString("0x%1").arg((quintptr)imageInfos.pDatas, QT_POINTER_SIZE * 2, 16, QChar('0'))
        )
    );


    this->iv.setImageFromQImage(*img);
    this->iv.show();

    // pixel type is 3 => 12 bit: Mono12
    ui->logOutput->appendPlainText(QString("tImagePixelType: ").append(QString::number(imageInfos.eImagePixelType)));
}

setImageFromQImage

void ImageViewer::setImageFromQImage(QImage image)
{
    this->ui->imageLabel->setPixmap(QPixmap::fromImage(image));
}

Вот некоторый вывод, который я собрал с картинки:

image infos: [ height: 1024, width: 1280, iLinePitch: 2560, adress: 0x00000175da5b3040 ]
tImagePixelType: 3

Знаете ли вы, как правильно преобразовать данные изображения из пустого указателя? Тогда, пожалуйста, просветите меня ...

1 Ответ

0 голосов
/ 20 июля 2018

Вот рабочее решение:

cv::Mat openCvImage(1024, 1280, CV_16UC1, imageInfos.pDatas);
openCvImage.convertTo(openCvImage, CV_8UC1, 0.04);
QImage qImage = QImage(
    openCvImage.data,
    1280,
    1024,
    QImage::Format_Grayscale8
);
imageLabel.setPixmap(QPixmap::fromImage(img));
if(!imageLabel.isVisible()) {
    imageLabel.show();
}
...