Я получаю доступ к камере через 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
структурируйте комментарии, так что теперь есть дополнительная информация в другом месте. Я знаю из 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
Знаете ли вы, как правильно преобразовать данные изображения из пустого указателя?
Тогда, пожалуйста, просветите меня …
Вот рабочее решение:
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();
}
Других решений пока нет …