Как создать экземпляр Python ctypes
Я пытаюсь использовать библиотеку pyueye для запуска камер ML, и у меня возникают проблемы с ctypes. Для одной функции требуется аргумент типа "экземпляр ctypes", и, несмотря на попытки всех возможных вариантов, я не могу понять, как создать это с помощью библиотеки ctypes. Для этой библиотеки нет документации по python, но документация C для функции, которую я пытаюсь использовать, следующая:
Syntax
INT is_SetAutoParameter (HIDS hCam, INT param, double* pval1, double* pval2)
Example 1
//Enable auto gain control:
double dEnable = 1;
int ret = is_SetAutoParameter (hCam, IS_SET_ENABLE_AUTO_GAIN, &dEnable, 0);
Код и последующая ошибка, которую я получаю в python:
nRet = ueye.is_SetAutoParameter(hCam, ueye.IS_SET_ENABLE_AUTO_GAIN, ctypes.byref(ctypes.c_long(1)), ctypes.byref(ctypes.c_long(0)))
Error:
ret = _is_SetAutoParameter(_hCam, _param, ctypes.byref(pval1), ctypes.byref(pval2))
TypeError: byref() argument must be a ctypes instance, not 'CArgObject'
Какие-нибудь советы по экземплярам ctypes? благодаря
РЕДАКТИРОВАТЬ: минимальный воспроизводимый пример
from pyueye import ueye
import ctypes
class Turfcam:
def main(self):
turfcam.take_photo()
def take_photo(self):
hCam = ueye.HIDS(0)
pval1 = ctypes.c_double(1)
pval2 = ctypes.c_double(0)
nRet = ueye.is_SetAutoParameter(hCam, ueye.IS_SET_ENABLE_AUTO_GAIN, ctypes.byref(pval1), ctypes.byref(pval2))
# Camera Init
nRet = ueye.is_InitCamera(hCam, None)
if __name__ == "__main__":
turfcam = Turfcam()
turfcam.main()
2 ответа
В
pyueye
В библиотеке есть минимальная документация:
_is_SetAutoParameter = _bind("is_SetAutoParameter", [ctypes.c_uint, ctypes.c_int, ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double)], ctypes.c_int)
def is_SetAutoParameter(hCam, param, pval1, pval2):
"""
:param hCam: c_uint (aka c-type: HIDS)
:param param: c_int (aka c-type: INT)
:param pval1: c_double (aka c-type: double \*)
:param pval2: c_double (aka c-type: double \*)
:returns: success, or no success, that is the answer
:raises NotImplementedError: if function could not be loaded
"""
if _is_SetAutoParameter is None:
raise NotImplementedError()
_hCam = _value_cast(hCam, ctypes.c_uint)
_param = _value_cast(param, ctypes.c_int)
ret = _is_SetAutoParameter(_hCam, _param, ctypes.byref(pval1), ctypes.byref(pval2))
return ret
Обертка выполняет
byref
, так что только
ctypes
объект необходимо передать. В документации uEye говорится, что параметры могут быть входными или выходными, поэтому всегда создавайте
c_double
объекты и инициализировать их по мере необходимости для переданной функции. Обратите внимание, что для выходного параметра вы должны присвоить объекту имя, чтобы оно существовало после запрашиваемого вызова. Входные параметры могут уйти при прохождении
ctypes.c_double(value)
непосредственно в функцию, но для единообразия я всегда присваиваю имена объектам:
Пример:
pval1 = ctypes.c_double()
pval2 = ctypes.c_double() # not used for output on IS_GET_ENABLE_AUTO_GAIN
nRet = ueye.is_SetAutoParameter(hCam, ueye.IS_GET_ENABLE_AUTO_GAIN, pval1, pval2)
print(pval1.value) # query the returned value
Чтобы завершить ответ, данный Марком Толоненом: следующий код работает нормально (но, возможно, вы также хотите проверить код ошибки nRet):
def take_photo(self):
hCam = ueye.HIDS(0)
# Camera Init (you must do this before using hCam !!)
nRet = ueye.is_InitCamera(hCam, None)
pval1 = ctypes.c_double(1)
pval2 = ctypes.c_double(0)
nRet = ueye.is_SetAutoParameter(hCam, ueye.IS_SET_ENABLE_AUTO_GAIN, pval1, pval2)