我正在使用Qt中的ThermoVision SDK与FLIR A320红外热像仪进行通信。 ThermoVision SDK基于ActiveX。我无法使用GetImage方法从相机中检索图像,根据手册可以按以下方式使用:
Image = Object.GetImage(imageType)
图像的类型为VARIANT,包含带图像像素的二维数组或错误代码(短)。 imageType确定像素的类型(16位无符号整数,单精度浮点数或8位无符号整数)。
我在Qt工作,所以我通过dumpcpp.exe为ActiveX组件创建了一个包装器。不幸的是,GetImage方法现在返回一个QVariant而不是VARIANT:
inline QVariant LVCam::GetImage(int imageType)
{
QVariant qax_result;
void *_a[] = {(void*)&qax_result, (void*)&imageType};
qt_metacall(QMetaObject::InvokeMetaMethod, 46, _a);
return qax_result;
}
我按如下方式调用GetImage方法:
QVariant vaIm = m_ircam->GetImage(20 + 3);
如何访问QVariant中的像素,例如通过将其转换为浮动的二维数组?我尝试使用像QVariant :: toFloat(),QVariant :: toByteArray(),QVariant :: toList()这样的方法,但它们似乎都没有返回图像数据。
任何帮助将不胜感激。
答案 0 :(得分:0)
该函数返回一个内存地址,您需要从内存中获取值,因此需要知道图像的确切大小。
试试这个:
auto width = m_ircam->GetCameraProperty(66).toInt();
auto height = m_ircam->GetCameraProperty(67).toInt();
auto hMem = reinterpret_cast<HGLOBAL>(m_ircam->GetImage(20 + 3).toInt());
auto pSrc = reinterpret_cast<float*>(GlobalLock(hMem));
for(auto i = 0; i < width; ++i)
{
for(auto j = 0; j < height; ++j)
{
arr[i][j] = pSrc[j * width + i]; //Assuming arr is a float[][]
}
}
GlobalUnlock(hMem);