2014-08-29 65 views
2

我正在Qt中使用ThermoVision SDK與FLIR A320紅外熱像儀進行通信。 ThermoVision SDK是基於ActiveX的。我無法從照相機與所述的getImage方法,該方法按手冊可以以下面的方式被使用檢索圖像:如何從QVariant中提取單精度浮點數的二維數組?

Image = Object.GetImage(imageType) 

圖片類型VARIANT的幷包含與圖像的2維數組的像素或錯誤代碼(短)。 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

嗨,你有沒有tryed做一個簡單的qDebug()<< vaIm,只是爲了檢查的QVariant是如何組織的?我的意思是:一個QVariant可以「包含」各種類型的cointainer,所以我會先「推測」它。 – Albert 2014-09-26 10:11:50

回答

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); 
相關問題