我正在使用ctypes訪問National Instruments(NI-IMAQ)的圖像獲取API。在其中,有一個imgBayerColorDecode()我正在使用的imgSnap()函數,該函數用于從該函數返回的Bayer編碼圖像上。我想將解碼后的輸出(即RGB圖像)與我將基于原始數據創建的一些numpy ndarray進行比較,這是imgSnap返回的內容。但是,有兩個問題。第一個很簡單:將imgSnap返回的imgbuffer傳遞到numpy數組中?,F在首先要注意一個問題:如果您的計算機是64位的,并且具有超過3GB的RAM,則無法使用numpy創建數組并將其作為指向imgSnap的指針傳遞。這就是為什么您必須實施一種解決方法,在NI的論壇上進行了介紹(NI ref-前2個帖子):禁用錯誤消息(以下代碼中的第125行:),imaq.niimaquDisable32bitPhysMemLimitEnforcement并確保創建內存的是IMAQ庫圖片(imaq.imgCreateBuffer)必需。在那之后,這樣的食譜應該能夠再次將緩沖區轉換為numpy數組。但是我不確定是否對數據類型進行了正確的更改:相機具有1020x1368像素,每個像素強度的記錄精度均為10位。它通過CameraLink返回圖像,我假設它以每個像素2個字節的方式進行處理,以便于數據傳輸。這是否意味著我必須調整另一個SO問題中給出的配方:buffer = numpy.core.multiarray.int_asbuffer(ctypes.addressof(y.contents), 8*array_length)a = numpy.frombuffer(buffer, float)對此:bufsize = 1020*1368*2buffer = numpy.core.multiarray.int_asbuffer(ctypes.addressof(y.contents), bufsize)a = numpy.frombuffer(buffer, numpy.int16)第二個問題是imgBayerColorDecode()沒有給我期望的輸出。以下是2張圖片,第一張是imgSnap的輸出,保存為imgSessionSaveBufferEx()。第二個是imgSnap的去馬賽克化imgBayerColorDecode()之后的輸出。原始數據:i42.tinypic.com/znpr38.jpg拜耳解碼:i39.tinypic.com/n12nmq.jpg如您所見,拜耳解碼后的圖像仍然是灰度圖像,而且它與原始圖像不一樣(這里的小注釋,圖像已縮放以使用imagemagick上傳)。原始圖像是在某個蒙版之前使用紅色濾色鏡拍攝的。從它(和其他2個濾色器)中,我知道Bayer濾色器在左上角看起來像這樣:BGBGGRGR我相信我在將正確類型的指針傳遞給imgBayerDecode時做錯了
2 回答

慕村225694
TA貢獻1880條經驗 獲得超4個贊
經過一番摸索之后,事實證明,提到的RGBbuffer必須保存正確的數據,但是imgSessionSaveBufferEx
在這一點上做得有些奇怪。
當我將數據從RGBbuffer傳遞回numpy時,將此1D數組重塑為圖像的尺寸,然后通過遮罩和使用bitshift操作(例如red_channel = (np_RGB & 0XFF000000)>>16
)將其分成彩色通道,然后可以將其保存為一個漂亮的彩色圖像PIL或pypng的png格式。
我還沒有找到為什么imgSessionSaveBufferEx表現奇怪的原因,但是上述解決方案有效(即使在速度方面它確實效率不高)。
添加回答
舉報
0/150
提交
取消