Raspberry Pi — открытое резюме и C++

Мы делаем проект в школе, где нам нужно выполнить базовую обработку изображений. Что мы хотим сделать в нашем проекте, так это делать снимки каждые 50 мс (или быстрее) с помощью нашего Raspberry Pi и выполнять обработку изображений в реальном времени.

Мы пытались включить raspistill в нашу python-программу, но пока ничего не получилось. Цель нашего проекта — спроектировать радиоуправляемую машину, которая движется по линии синего/красного/любого цвета с помощью обработки изображений.

Мы подумали, что было бы неплохо создать программу на Python, которая выполняет всю необходимую обработку изображений, но в настоящее время мы боремся с идеей переноса записанных изображений в программу на Python. Есть ли способ сделать это с помощью пикамера или мы должны попробовать другой способ?

Заранее спасибо, антркс.


person anthrx    schedule 03.06.2016    source источник
comment
Вы ищете код или просто общую структуру того, как это сделать?   -  person Chrispresso    schedule 03.06.2016
comment
Это может помочь... stackoverflow.com/a/37441369/2836621   -  person Mark Setchell    schedule 03.06.2016
comment
@ZWiki эй, извини, что не отвечаю быстрее. Я был занят учебой и прочим, так что у меня не было времени проверить. Мне просто было любопытно, как мы должны это сделать, а не искать конкретный код.   -  person anthrx    schedule 09.06.2016
comment
@ZWiki Сейчас мы считываем значения пикселей предварительно записанного изображения, но сейчас мы читаем только самую нижнюю строку пикселей, которая нам нужна для нашего алгоритма управления сервоприводами. Нашей главной целью сейчас было бы сфотографировать только этот результат, чтобы мы оптимизировали время выполнения, и прямо сейчас мы управляем только жестким кодом. К чему мы стремимся, так это к управлению и контролю наших сервоприводов в зависимости от нашего алгоритма. Если хотите, я могу дать вам код, который мы сейчас используем, но не сегодня, а завтра в это время.   -  person anthrx    schedule 09.06.2016


Ответы (1)


Я просто расскажу, как это сделать, не написав полную программу. Короткий ответ: это ОЧЕНЬ возможно и относительно просто.

Шаг 1. Получите изображение с камеры
Для этого я бы рекомендовал просто использовать VideoCapture и обрабатывать каждое поступающее изображение. Это можно сделать следующим образом:

import numpy as np
import cv2
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read() # Read the current frame

Шаг 2: определение цвета (я приведу пример красного)
Для этого вам нужно будет определить некоторые границы в цветовом пространстве RGB. Для этого вам действительно нужно определить некоторые нижние и верхние границы

boundaries = [
([17, 15, 100], [50, 56, 200]),
([25, 146, 190], [62, 174, 250])
]

Это нижняя и верхняя границы двух границ. Например, ([17, 15, 100], [50, 56, 200]) говорит, что мы ищем R>=17, B>=15, G>=100 и R<=50, B<=56, G<=200. И да, для этого используется формат RBG из-за схемы по умолчанию в OpenCV.

Шаг 3. Соберите все воедино

while True:
    ret, frame = cap.read() # Read the current frame
    for (lo, up) in boundaries:
        lo = np.array(lo, dtype='uint8')
        up = np.array(up, dtype='uint8')

        # Find the colors within those boundaries in the image
        mask = cv2.inRange(frame, lo, up)
        out = cv2.bitwise_and(frame, frame, mask=mask)

out теперь содержит текущий кадр, но только red, который находится на изображении в этих границах. Затем вы можете определить, достаточно ли красного на изображении, чтобы следовать, поворачивать или что-то еще. Если вы хотите на самом деле определить, является ли это какой-то линией, вы также можете использовать findContours, чтобы определить форму объекта, выделенного красным, а затем выяснить, является ли это линией таким образом.

person Chrispresso    schedule 03.06.2016
comment
чего я тут не понимаю, скажем, мы просто берем кадр и используем его для нашего алгоритма. Как именно мне это реализовать? Прямо сейчас мы делаем это с img = cv2.imread('image1.jpg') но похоже, что мы не берем .jpg в конце. - person anthrx; 12.06.2016
comment
Когда вы это сделаете, вы получите массив значений numpy между [0,255]. Вам нужно создать/найти алгоритм, который затем позволяет отслеживать эту красную линию на основе диапазона цветовых пикселей (например, границ, перечисленных выше). - person Chrispresso; 13.06.2016