1 Qter豆
我知道在Qt中想用QLabel显示IplImage图像数据需要先转化成QImage类型,但是我对转换的原理不是很清楚,图像数据的不同通道数、位深、相机的彩色黑白都应该怎么转换?
下面是我从网上找的的代码:
QImage* IplImage2QImage(IplImage *iplImg)
{
int h = iplImg->height;
int w = iplImg->width;
int channels = iplImg->nChannels;
QImage *qimg = new QImage(w, h, QImage::Format_RGB888);
char *data = iplImg->imageData;
for (int y = 0; y < h; y++, data += iplImg->widthStep)
{
for (int x = 0; x < w; x++)
{
char r, g, b, a = 0;
if (channels == 1)
{
r = data[x * channels];
g = data[x * channels];
b = data[x * channels];
}
else if (channels == 3 || channels == 4)
{
r = data[x * channels + 2];
g = data[x * channels + 1];
b = data[x * channels];
}
if (channels == 4)
{
a = data[x * channels + 3];
qimg->setPixel(x, y, qRgba(r, g, b, a));
}
else
{
qimg->setPixel(x, y, qRgb(r, g, b));
}
}
}
return qimg;
}
void Guider::GetSingleFrame()
{
ImgData = (unsigned char *)malloc(length);
memset(ImgData,0,length);
ret = GetFrame(camhandle,&imagew,&imageh,&bpp,&channels,ImgData);
if(ret == SUCCESS){
IplImage *image = cvCreateImage(cvSize(imagew,imageh),bpp,channels);
image->imageData = (char *)ImgData;
IplImage *dst;
CvSize dst_cvsize;
dst_cvsize.width = ui->img_lpl->width();
dst_cvsize.height = ui->img_lpl->height();
dst = cvCreateImage(dst_cvsize,image->depth,image->nChannels);
cvResize(image,dst,CV_INTER_LINEAR);
qImg_capture = IplImage2QImage(dst);
ui->img_lpl->setPixmap(QPixmap::fromImage(*qImg_capture));
ui->img_lpl->show();
}
}
这个只能显示8位一通道的黑白图像,显示其他的就会出问题。
我来回答