少し前に、インターネットでそれを行う方法の例をいくつか見つけました。より簡単な方法で画像をコピーする方法について、例を少し改善しました。Qt は通常、char ピクセルでのみ動作します (他の画像形式は通常 HDR 画像と呼ばれます)。opencv で 32 ビット rgb のビデオ バッファを取得する方法を知りたいと思っていました...私はそれを見たことがありません!
opencv にカラー画像がある場合は、この関数を使用してメモリを割り当てることができます。
QImage* allocateqtimagefromcv(IplImage* cvimg)
{
//if (cvimg->nChannels==1)
// {
// return new QImage(cvimg->width,cvimg->height,QImage::Format_Indexed8);
// }
if (cvimg)
{
return new QImage(cvimg->width,cvimg->height,QImage::Format_ARGB32);
}
}
IplImage を qt イメージにコピーするには、簡単な方法で次の関数を使用できます。
void IplImage2QImage(IplImage *iplImg,QImage* qimg)
{
char *data = iplImg->imageData;
int channels = iplImg->nChannels;
int h = iplImg->height;
int w = iplImg->width;
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)
{
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));
}
}
}
}
次の関数は、より迅速な解決策になる可能性があります。
static QImage IplImage2QImage(const IplImage *iplImage)
{
int height = iplImage->height;
int width = iplImage->width;
if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 3)
{
const uchar *qImageBuffer =(const uchar*)iplImage->imageData;
QImage img(qImageBuffer, width, height, QImage::Format_RGB888);
return img.rgbSwapped();
}else{
//qWarning() << "Image cannot be converted.";
return QImage();
}
}
私の機能がお役に立てば幸いです。多分誰かがそれを行うより良い方法を知っています:)