Как создать экземпляр 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)
Другие вопросы по тегам