шаблоны сайт визитка joomla
Скачать шаблоны Joomla 3.5 бесплатно
Вы находитесь здесь:Главная»Учебные материалы»Raspberry»Управление светодиодом, зависимое от положения камеры

Управление светодиодом, зависимое от положения камеры

 

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

Вариант 1:

Требования к оборудованию

 · RPi
 · Ноутбук / компьютер, который может подключаться к сетям Wi-Fi.
 · Raspberry Pi (Мы будем использовать модель B)
· USB камера
· Провода

Требования к программному обеспечению

· IDLE (версия Python версии 2.7 ) с Opencv

Схема сборки:

piuyt

Описание кода:

В зависимости от положения центра линии относительно центра вида камеры будет загораться соответствующий светодиод.

import sys
sys.path.append('/usr/local/lib/python2.7/site-packages')

import RPi.GPIO as GPIO
import time

import cv2
import numpy as np

pin_l = номер_левого_пина_светодиода
pin_r = номер_правого_пина_светодиода

GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin_l, GPIO.OUT)
GPIO.setup(pin_r, GPIO.OUT)

capture = cv2.VideoCapture(0)
cx, cy = 0, 0

capture.set(3,320.0)
capture.set(4,240.0)
capture.set(5,15)

cvx = (capture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH) / 2)

for i in range(0,2):
    flag, trash = capture.read()
   
while cv2.waitKey(1) != 27:
    flag, frame = capture.read()
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray,(5,5),0)
    ret,th1 = cv2.threshold(blur,35,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    ret1,th2 = cv2.threshold(th1,127,255,cv2.THRESH_BINARY_INV)
    contours, hierarchy = cv2.findContours(th2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(frame,contours,-1,(0,255,0),3)
    for cnt in contours:
        if cnt is not None:
            area = cv2.contourArea(cnt)
            if area >= 500:

                M = cv2.moments(cnt)
                cx = int(M['m10']/M['m00'])
                cy = int(M['m01']/M['m00'])
                cv2.circle(frame, (cx,cy), 3, (255,0,0), -1)
                cv2.circle(frame, (cx,cy), 2, (0,255,0), -1)
                cv2.circle(frame, (cx,cy), 1, (0,0,255), -1)
               
                cv2.imshow('frame',frame)

        if cx > cvx:
            GPIO.output(pin_l, 0)
            GPIO.output(pin_r, 1)
           
        if cx < cvx:
            GPIO.output(pin_l, 1)
            GPIO.output(pin_r, 0)

capture.release()
GPIO.cleanup()
cv2.destroyAllWindows()

S

 

Вариант 2:

Требования к оборудованию

 · RPi
 · Ноутбук / компьютер, который может подключаться к сетям Wi-Fi.
 · Raspberry Pi (Мы будем использовать модель B)
· RPi камера

IMG 20170622 105801

 · Провода

Требования к программному обеспечению

· IDLE (версия Python версии 2.7 ) с Opencv и picamera

Описание кода:

В зависимости от положения центра линии относительно центра вида камеры будет загораться соответствующий светодиод.

import sys
sys.path.append('/usr/local/lib/python2.7/site-packages')

import RPi.GPIO as GPIO
import time

import cv2
import numpy as np

import picamera
import picamera.array

cx,cy = 0,0
width,height = 320,240
pin_l,pin_r = 36,37

cvx = (width/2)

GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin_l,GPIO.OUT)
GPIO.setup(pin_r,GPIO.OUT)

GPIO.setwarnings(False)

with picamera.PiCamera() as camera:
    with picamera.array.PiRGBArray(camera) as stream:
        camera.resolution = (width,height)
        camera.framerate = 15

        while(cv2.waitKey(1) != 27):
            camera.capture(stream,'bgr',use_video_port = True)

            flag, frame = stream.array, stream.array
            gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
            blur = cv2.GaussianBlur(gray,(5,5),0)
            ret,th1 = cv2.threshold(blur,35,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
            ret1,th2 = cv2.threshold(th1,127,255,cv2.THRESH_BINARY_INV)

            contours, hierarchy = cv2.findContours(th2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
            cv2.drawContours(frame,contours,-1,(0,255,0),3)

            for cnt in contours:
                if cnt is not None:

                    area = cv2.contourArea(cnt)
                    if area >= 500:

                        M = cv2.moments(cnt)

                        cx = int(M['m10']/M['m00'])
                        cy = int(M['m01']/M['m00'])
                        cv2.circle(frame,(cx,cy),3,(255,0,0),-1)
                        cv2.circle(frame,(cx,cy),2,(0,255,0),-1)

                        cv2.circle(frame,(cx,cy),1,(0,0,255),-1)
                        

                        cv2.imshow('frame',frame)
                        
                        stream.seek(0)

                        stream.truncate()
                        
                if cx > cvx:
                    GPIO.output(pin_l,0)
                    GPIO.output(pin_r,1)
            
                if cx < cvx:
                    GPIO.output(pin_l,1)
                    GPIO.output(pin_r,0)
                        
        GPIO.cleanup()
        cv2.destroyAllWindows()

 

IMG 20170622 105242

 

 

Похожие материалы (по тегу)

Другие материалы в этой категории: « Управление светодиодом

Новости о нас

Расписание занятий для каждой сформированной группы по робототехнике на 2017-2018 учебный год. Подробнее
Учебный год начался, и у нас очередная радостная новость для вас, педагоги! В этом году... Подробнее
Наши учащиеся выступили на августовской конференции педагогов! Подробнее
Хочешь учиться в Толтеке по выгодной цене? Приводи друзей и получай большие скидки!... Подробнее
19 августа в ТРЦ Сити Молл с блеском прошел РобоКвест! Героями квеста стали более сотни... Подробнее

Наши партнеры

 TZOyoOCZ8y0 logotip novy SF BashGU  utv logo  CityMoll  VolnoeDelo