Raspberry Pi Камера шаговые двигатели Открыть CV

#python #opencv #raspberry-pi

#python #opencv #raspberry-pi

Вопрос:

Я написал программу, которая в основном последовательно подводит лоток под камеру, подключенную к Raspberry Pi, используя шаговый двигатель драйвер a4988. Код возвращает лоток в исходное положение, делает шаг, делает снимок и повторяет это 10 раз. Затем лоток возвращается в исходное положение. Что я должен получить, так это 10 фотографий каждой секции лотка с тем, что находится в лотке.

Однако я получаю 7 фотографий, которые являются точно такой же фотографией, а затем 3, которые отличаются, и я не могу понять, почему.

Я думаю, что камера делает снимки быстрее, чем перемещается лоток, но из кода я не могу понять, почему это было бы.

Я использую OpenCV для получения фотографии, потому что я планирую анализировать каждую фотографию по мере ее поступления.

Спасибо!!

Вот мой код:

 from time import sleep
import RPi.GPIO as GPIO
import cv2

cam = cv2.VideoCapture(0)

DIR = 20   # Direction GPIO Pin
STEP = 21  # Step GPIO Pin
CW = 1     # Clockwise Rotation
CCW = 0    # Counterclockwise Rotation
SPR = 200   # Steps per Revolution (360 / 1.8)

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(DIR, GPIO.OUT)
GPIO.setup(STEP, GPIO.OUT)
GPIO.output(DIR, CW)

MODE = (14, 15, 18)   # Microstep Resolution GPIO Pins
GPIO.setup(MODE, GPIO.OUT)
RESOLUTION = {'Full': (0, 0, 0),
              'Half': (1, 0, 0),
              '1/4': (0, 1, 0),
              '1/8': (1, 1, 0),
              '1/16': (1, 1, 1),}

GPIO.output(MODE, RESOLUTION['1/16'])
delay2 = 0.0208/32
GPIO.output(DIR, CCW)
for x in range (1500): # Brings Tray to level of first photo
    GPIO.output(STEP, GPIO.HIGH)
    sleep(delay2)
    GPIO.output(STEP, GPIO.LOW)
    sleep(delay2)
sleep(.5)
for a in range (0,9): # Begins 10 photos
    for b in range (250): #Motor steps between photos
        GPIO.output(STEP, GPIO.HIGH)
        sleep(delay2)
        GPIO.output(STEP, GPIO.LOW)
        sleep(delay2)
    sleep(.5)

    ret, frame = cam.read() #Sets up cam for photo
    cv2.imwrite("image" str(a) ".jpg", frame)  #Write photo to file
    sleep(2)

GPIO.output(DIR, CW)
for x in range(3750): # Pushes Tray out to original starting position
    GPIO.output(STEP, GPIO.HIGH)
    sleep(delay2)
    GPIO.output(STEP, GPIO.LOW)
    sleep(delay2)
sleep(.5)

cam.release()
GPIO.cleanup()
  

Комментарии:

1. Вы пробовали устанавливать все задержки на 2 секунды или что-то нелепое в этом роде? Это должно показать вам, в чем заключается проблема синхронизации.

2. Да, это заняло до 3 секунд, файлы изображений генерируются на каждом шаге, а не все сразу, чего я ожидал бы, если бы фотографии были сделаны в странные моменты времени. Первые 7 фотографий всегда одинаковы, затем последние 3 являются правильными.

3. Я также установил режим ожидания между каждым этапом фотосъемки, чтобы камера «прогревалась», но оставалась такой же

4. Я думаю, камера буферизует 5 кадров, поэтому вам нужно постоянно читать (непрерывно) и отбрасывать те, которые вам не нужны.

5. Марк может быть прав, также попробуйте запустить вызов видеосъемки прямо перед циклом камеры

Ответ №1:

Решил это благодаря Марку и Мэтту. Спасибо за всю вашу помощь. Было решено путем вызова видеозахвата на каждом шаге двигателя, а затем отпускания его каждый раз.

Вот код:

 for a in range(1,10):
cam=cv2.VideoCapture(0)
ret, frame = cam.read()
cv2.imwrite('iamge' str(a) "jpg", frame)
cam.release
  

… и т.д. и т.п.

Итак, для каждого шага вызывается и выпускается камера, которая, похоже, решает проблему

Спасибо всем

Комментарии:

1. Открывать и закрывать камеру для каждого снимка не идеально — вы также можете снимать кадры (фотографии, а не видео). Может быть, подумайте о том, чтобы иметь второй поток, который держит камеру открытой и непрерывно получает, скажем, 4 буфера, циклическим способом и просто берет последний полный кадр, когда он вам нужен в потоке обработки.