ctypes指针(python)中的相机图像格式不正确

2024-06-16 09:33:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用一个DLL库来调用函数来操作python中的相机,我可以使用ctypes检索图像,但是它的格式不正确。返回的图像是重复的,其中一半是空白的。我需要做些什么来解决这个问题?在

我有一个labview程序,它可以正确地从相机上拍摄图像,所以它们应该是这样的。在

使用Labview检索到正确的图像

Image from Labview

使用Python检索的图像: Image from 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++图像获取代码:

^{pr2}$

Tags: 代码图像importasnppltctypeswidth
1条回答
网友
1楼 · 发布于 2024-06-16 09:33:08

基于你的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)

相关问题 更多 >