簡體   English   中英

相機圖像的ctypes指針格式錯誤(python)

[英]camera image incorrectly formatted in ctypes pointer (python)

我正在使用DLL庫來調用函數以在python中操作相機,並且我能夠使用ctypes檢索圖像,但其格式設置不正確。 返回的圖像已重復,其中一半為空白。 我需要怎么做才能解決此問題?

我有一個labview程序,可以正確地從相機拍攝圖像,因此它們應該是這樣的。

糾正使用Labview檢索的圖像

圖片來自Labview

使用Python檢索的圖像: 來自Python的圖片

圖像被復制,並且在python中也橫盤整理。

python代碼:

from ctypes import *
import numpy as np
import matplotlib.pyplot as plt
mydll = windll.LoadLibrary('StTrgApi.dll')
hCamera = mydll.StTrg_Open()
print(hCamera)

im_height = 1200
im_width = 1600

dwBufferSize = im_height * im_width

pbyteraw = np.zeros((im_height, im_width), dtype=np.uint16)

dwNumberOfByteTrans = 0
dwNumberOfByteTrans = (c_ubyte * dwNumberOfByteTrans)()

dwFrameNo = 0
dwFrameNo = (c_ubyte * dwFrameNo)()

dwMilliseconds = 3000
mydll.StTrg_TakeRawSnapShot(hCamera, 
pbyteraw.ctypes.data_as(POINTER(c_int16)), dwBufferSize*2, 
dwNumberOfByteTrans, dwFrameNo, dwMilliseconds)

print(pbyteraw)
plt.matshow(pbyteraw)
plt.show()

拍攝圖像的C ++代碼:

DWORD dwBufferSize = 0;
    if(!StTrg_GetRawDataSize(hCamera, &dwBufferSize))
    {
        _tprintf(TEXT("Get Raw Data Size Failed.\n"));
        return(-1);
    }

    PBYTE pbyteRaw = new BYTE[dwBufferSize];
    if(NULL != pbyteRaw)
    {
        DWORD dwNumberOfByteTrans = 0;
        DWORD dwFrameNo = 0;
        DWORD dwMilliseconds = 3000;
        for(DWORD dwPos = 0; dwPos < 10; dwPos++)
        {

            if(StTrg_TakeRawSnapShot(hCamera, pbyteRaw, dwBufferSize, 
&dwNumberOfByteTrans, &dwFrameNo, dwMilliseconds))
        {
            TCHAR szFileName[MAX_PATH];
            if(is2BytesMode)
            {
                _stprintf_s(szFileName, _countof(szFileName), TEXT("%s\\%u.tif"), szBitmapFilePath, dwFrameNo);
                StTrg_SaveImage(dwWidth, dwHeight, STCAM_PIXEL_FORMAT_16_MONO_OR_RAW, pbyteRaw, szFileName, 0);
            }
            else
            {
                _stprintf_s(szFileName, _countof(szFileName), TEXT("%s\\%u.bmp"), szBitmapFilePath, dwFrameNo);
                StTrg_SaveImage(dwWidth, dwHeight, STCAM_PIXEL_FORMAT_08_MONO_OR_RAW, pbyteRaw, szFileName, 0);
            }
            _tprintf(TEXT("Save Image:%s\n"), szFileName);
        }
        else
        {
            _tprintf(TEXT("Fail:StTrg_TakeRawSnapShot\n"));
            break;
        }
    }
    delete[] pbyteRaw;
}

根據您的C代碼,類似的東西應該可以工作,但是由於我沒有您的相機庫,因此未經測試。 如果您使用的是32位Python,請確保庫調用為__stdcall以使用WinDLL ,否則請使用CDLL 64位Python沒關系。 定義參數類型和返回類型有助於捕獲錯誤。 對於輸出參數,創建正確ctype的實例,然后傳遞byref() 您當前執行輸出參數的方式可能是導致崩潰的原因。 設置argtypes將檢測到這些值不是指向DWORD的指針。

from ctypes import *
from ctypes import wintypes as w

mydll = WinDLL('StTrgApi')

mydll.StTrg_Open.argtypes = None
mydll.StTrg_Open.restype = w.HANDLE

mydll.StTrg_GetRawDataSize.argtypes = w.HANDLE,w.PDWORD
mydll.StTrg_GetRawDataSize.restype = None

mydll.StTrg_TakeRawSnapShot.argtypes = w.HANDLE,w.PBYTE,w.DWORD,w.PDWORD,w.PDWORD,w.DWORD
mydll.StTrg_TakeRawSnapShot.restype = None

hCamera = mydll.StTrg_Open()
print(hCamera)

dwBufferSize = w.DWORD()
mydll.StTrg_GetRawDataSize(hCamera,byref(dwBufferSize))

pbyteraw = (w.BYTE * dwbufferSize)()
dwNumberOfByteTrans = w.DWORD() # output parameters.  Pass byref()
dwFrameNo = w.DWORD()           # output parameters.  Pass byref()
dwMilliseconds = 3000

mydll.StTrg_TakeRawSnapShot(hCamera,
                            pbyteraw,
                            dwbufferSize,
                            byref(dwNumberOfByteTrans),
                            byref(dwFrameNo),
                            dwMilliseconds)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM