Управление шаговыми двигателями и камерой одновременно - PullRequest
0 голосов
/ 26 сентября 2019

как лучше одновременно управлять шаговым двигателем и камерой?

Предположим, что камера находится на линейной сцене (шаговый двигатель), и я хочу перемещать сцену с шагом 1 мм и захватывать кадр в конце каждого шага.Оба устройства (камера и сцена) подключены к моему компьютеру (Ubuntu 18.04.3 LTS) через 2 разных порта USB 2.0.

Мой скрипт для камеры выглядит примерно так:

def camera():
    ...
    ...
    ...
    while(True):
        cv2.imshow('live', frame)
        ueye.is_ExitCamera(hCam2)
        cv2.destroyAllWindows()

if __name__ == "__main__":
    camera()

и выводит прямую трансляцию с камеры.

Для мотора что-то вроде:

i = 0
while i < 6:           # Move 6 times
    stepper.Move(0.5)  # Moves forward by 0.5 mm
    time.sleep(1)      # Sleeps for a second
    i += 1

time.sleep(2)
print("\nProcess End\n")
close()                # closes port 

и двигается и спит по желанию.

Оба сценария успешно выполняются при отдельном исполнении.Однако как мне объединить эти сценарии, чтобы я мог сделать снимок в конце каждого шага?Для приведенного выше примера перемещения 6 раз я хочу получить 6 изображений в конце, захваченных в конце каждого шага.Следует ли использовать многопоточность, многопроцессорность? ... Оба устройства подключены к моему компьютеру через 2 отдельных порта USB 2.0.Я не новичок в программировании, но и не эксперт, поэтому любые предложения будут любезно оценены.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Прежде всего, спасибо Алексу за ответ. Я реализовал вашу идею и попытался создать функцию с именем capture(), которая захватывает кадр при вызове, как вы сказали в своем примере.Но, к сожалению, не работает после перехода.Чтобы проверить, правильно ли работает функция capture(), я попробовал следующее:

def capture():        
    ... 
    # saves image in the defined path when called

def camera():
    ...
    ...
    ...
    while(True):
        cv2.imshow('live', frame)
        if cv2.waitKey(1) & 255 == ord('q'):
            capture()
            cv2.destroyAllWindows()

if __name__ == "__main__":
    camera()

, и она работает, она сохраняет кадр после нажатия кнопки q и затем закрывает окно.

Чтобы иметь возможность захватить кадр, окно imshow должно быть открыто, что означает, что условие while True должно выполняться.Поскольку цикл while находится в функции camera(), как мне вызвать capture(), пока окно imshow все еще работает?

0 голосов
/ 26 сентября 2019

Есть ли причина, по которой вы не можете вызвать какую-либо функцию, которая захватывает изображение на каждом шаге?

# import modules for camera and stepper control

def step_and_capture(steps=6):
  images = []
  for x in range(steps):
    stepper.Move(0.5)
    image = cam_capture_method() # returns a photo or it could write to somewhere
    time.sleep(1)
  # save the images to folder?

if __name__ == "__main__":
    step_and_capture()
...