最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenCV物體跟蹤樹莓派視覺小車實現(xiàn)過程學習

 更新時間:2021年10月16日 14:41:02   作者:_睿智_  
這篇文章主要介紹了OpenCV物體跟蹤樹莓派視覺小車的實現(xiàn)過程學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

物體跟蹤效果展示

 

過程:

一、初始化

def Motor_Init():
    global L_Motor, R_Motor
    L_Motor= GPIO.PWM(l_motor,100)
    R_Motor = GPIO.PWM(r_motor,100)
    L_Motor.start(0)
    R_Motor.start(0) 
def Direction_Init():
    GPIO.setup(left_back,GPIO.OUT)
    GPIO.setup(left_front,GPIO.OUT)
    GPIO.setup(l_motor,GPIO.OUT)
    
    GPIO.setup(right_front,GPIO.OUT)
    GPIO.setup(right_back,GPIO.OUT)
    GPIO.setup(r_motor,GPIO.OUT)  
def Servo_Init():
    global pwm_servo
    pwm_servo=Adafruit_PCA9685.PCA9685()
def Init():
    GPIO.setwarnings(False) 
    GPIO.setmode(GPIO.BCM)
    Direction_Init()
    Servo_Init()
    Motor_Init()

二、運動控制函數(shù)

def Front(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,1)   #left_front
    GPIO.output(left_back,0)    #left_back
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,1)  #right_front
    GPIO.output(right_back,0)   #right_back      
def Back(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,0)   #left_front
    GPIO.output(left_back,1)    #left_back 
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,0)  #right_front
    GPIO.output(right_back,1)   #right_back 
def Left(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,0)   #left_front
    GPIO.output(left_back,1)    #left_back
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,1)  #right_front
    GPIO.output(right_back,0)   #right_back
def Right(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,1)   #left_front
    GPIO.output(left_back,0)    #left_back 
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,0)  #right_front
    GPIO.output(right_back,1)   #right_back 
def Stop():
    L_Motor.ChangeDutyCycle(0)
    GPIO.output(left_front,0)   #left_front
    GPIO.output(left_back,0)    #left_back
    R_Motor.ChangeDutyCycle(0)
    GPIO.output(right_front,0)  #right_front
    GPIO.output(right_back,0)   #right_back

三、舵機角度控制

def set_servo_angle(channel,angle):
    angle=4096*((angle*11)+500)/20000
    pwm_servo.set_pwm_freq(50)                #frequency==50Hz (servo)
    pwm_servo.set_pwm(channel,0,int(angle))
set_servo_angle(4, 110)     #top servo     lengthwise
    #0:back    180:front    
    set_servo_angle(5, 90)     #bottom servo  crosswise
    #0:left    180:right  

上面的(4):是頂部的舵機(攝像頭上下擺動的那個舵機)

下面的(5):是底部的舵機(攝像頭左右擺動的那個舵機)

四、攝像頭&&圖像處理

# 1 Image Process
        img, contours = Image_Processing()
width, height = 160, 120
    camera = cv2.VideoCapture(0)
    camera.set(3,width) 
    camera.set(4,height) 

1、打開攝像頭

打開攝像頭,并設置窗口大小。

設置小窗口的原因: 小窗口實時性比較好。

# Capture the frames
    ret, frame = camera.read()

2、把圖像轉(zhuǎn)換為灰度圖

# to gray
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)

3、 高斯濾波(去噪)

# Gausi blur
    blur = cv2.GaussianBlur(gray,(5,5),0)

4、亮度增強

#brighten
    blur = cv2.convertScaleAbs(blur, None, 1.5, 30)

5、轉(zhuǎn)換為二進制

#to binary
    ret,binary = cv2.threshold(blur,150,255,cv2.THRESH_BINARY_INV)
    cv2.imshow('binary',binary)

6、閉運算處理

#Close
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (17,17))
    close = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
    cv2.imshow('close',close)

7、獲取輪廓

#get contours
    binary_c,contours,hierarchy = cv2.findContours(close, 1, cv2.CHAIN_APPROX_NONE)
    cv2.drawContours(image, contours, -1, (255,0,255), 2)
    cv2.imshow('image', image)

代碼

def Image_Processing():
    # Capture the frames
    ret, frame = camera.read()
    # Crop the image
    image = frame
    cv2.imshow('frame',frame)
    # to gray
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('gray',gray)
    # Gausi blur
    blur = cv2.GaussianBlur(gray,(5,5),0)
    #brighten
    blur = cv2.convertScaleAbs(blur, None, 1.5, 30)
    #to binary
    ret,binary = cv2.threshold(blur,150,255,cv2.THRESH_BINARY_INV)
    cv2.imshow('binary',binary)
    #Close
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (17,17))
    close = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
    cv2.imshow('close',close)
    #get contours
    binary_c,contours,hierarchy = cv2.findContours(close, 1, cv2.CHAIN_APPROX_NONE)
    cv2.drawContours(image, contours, -1, (255,0,255), 2)
    cv2.imshow('image', image)
    return frame, contours

五、獲取最大輪廓坐標

由于有可能出現(xiàn)多個物體,我們這里只識別最大的物體(深度學習可以搞分類,還沒學到這,學到了再做),得到它的坐標。

# 2 get coordinates
        x, y = Get_Coord(img, contours)
def Get_Coord(img, contours):
    image = img.copy()
    try:
        contour = max(contours, key=cv2.contourArea)
        cv2.drawContours(image, contour, -1, (255,0,255), 2)
        cv2.imshow('new_frame', image)
        # get coord
        M = cv2.moments(contour)
        x = int(M['m10']/M['m00'])
        y = int(M['m01']/M['m00'])
        print(x, y) 
        return x,y
        
    except:
        print 'no objects'
        return 0,0

返回最大輪廓的坐標:

六、運動

根據(jù)反饋回來的坐標,判斷它的位置,進行運動。

# 3 Move
        Move(x,y)

1、沒有識別到輪廓(靜止)

    if x==0 and y==0:
        Stop()

2、向前走

識別到物體,且在正中央(中間1/2區(qū)域),讓物體向前走。

#go ahead
    elif width/4 <x and x<(width-width/4):
        Front(70)

3、向左轉(zhuǎn)

物體在左邊1/4區(qū)域。

#left
    elif x < width/4:
        Left(50)

4、向右轉(zhuǎn)

物體在右邊1/4區(qū)域。

#Right
    elif x > (width-width/4):
        Right(50)

代碼

def Move(x,y):
    global second
    #stop
    if x==0 and y==0:
        Stop()
    #go ahead
    elif width/4 <x and x<(width-width/4):
        Front(70)
    #left
    elif x < width/4:
        Left(50)
    #Right
    elif x > (width-width/4):
        Right(50)

總代碼

#Object Tracking
import  RPi.GPIO as GPIO
import time
import Adafruit_PCA9685
import numpy as np
import cv2
second = 0 
width, height = 160, 120
camera = cv2.VideoCapture(0)
camera.set(3,width) 
camera.set(4,height) 
l_motor = 18
left_front   =  22
left_back   =  27
r_motor = 23
right_front   = 25
right_back  =  24 
def Motor_Init():
    global L_Motor, R_Motor
    L_Motor= GPIO.PWM(l_motor,100)
    R_Motor = GPIO.PWM(r_motor,100)
    L_Motor.start(0)
    R_Motor.start(0) 
 def Direction_Init():
    GPIO.setup(left_back,GPIO.OUT)
    GPIO.setup(left_front,GPIO.OUT)
    GPIO.setup(l_motor,GPIO.OUT)    
    GPIO.setup(right_front,GPIO.OUT)
    GPIO.setup(right_back,GPIO.OUT)
    GPIO.setup(r_motor,GPIO.OUT) 
def Servo_Init():
    global pwm_servo
    pwm_servo=Adafruit_PCA9685.PCA9685()
def Init():
    GPIO.setwarnings(False) 
    GPIO.setmode(GPIO.BCM)
    Direction_Init()
    Servo_Init()
    Motor_Init()
def Front(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,1)   #left_front
    GPIO.output(left_back,0)    #left_back
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,1)  #right_front
    GPIO.output(right_back,0)   #right_back   
def Back(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,0)   #left_front
    GPIO.output(left_back,1)    #left_back 
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,0)  #right_front
    GPIO.output(right_back,1)   #right_back 
def Left(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,0)   #left_front
    GPIO.output(left_back,1)    #left_back 
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,1)  #right_front
    GPIO.output(right_back,0)   #right_back  
def Right(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,1)   #left_front
    GPIO.output(left_back,0)    #left_back 
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,0)  #right_front
    GPIO.output(right_back,1)   #right_back
def Stop():
    L_Motor.ChangeDutyCycle(0)
    GPIO.output(left_front,0)   #left_front
    GPIO.output(left_back,0)    #left_back 
    R_Motor.ChangeDutyCycle(0)
    GPIO.output(right_front,0)  #right_front
    GPIO.output(right_back,0)   #right_back
def set_servo_angle(channel,angle):
    angle=4096*((angle*11)+500)/20000
    pwm_servo.set_pwm_freq(50)                #frequency==50Hz (servo)
    pwm_servo.set_pwm(channel,0,int(angle)) 
def Image_Processing():
    # Capture the frames
    ret, frame = camera.read()
    # Crop the image
    image = frame
    cv2.imshow('frame',frame)
    # to gray
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('gray',gray)
    # Gausi blur
    blur = cv2.GaussianBlur(gray,(5,5),0)
    #brighten
    blur = cv2.convertScaleAbs(blur, None, 1.5, 30)
    #to binary
    ret,binary = cv2.threshold(blur,150,255,cv2.THRESH_BINARY_INV)
    cv2.imshow('binary',binary)
    #Close
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (17,17))
    close = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
    cv2.imshow('close',close)
    #get contours
    binary_c,contours,hierarchy = cv2.findContours(close, 1, cv2.CHAIN_APPROX_NONE)
    cv2.drawContours(image, contours, -1, (255,0,255), 2)
    cv2.imshow('image', image)
    return frame, contours
def Get_Coord(img, contours):
    image = img.copy()
    try:
        contour = max(contours, key=cv2.contourArea)
        cv2.drawContours(image, contour, -1, (255,0,255), 2)
        cv2.imshow('new_frame', image)
        # get coord
        M = cv2.moments(contour)
        x = int(M['m10']/M['m00'])
        y = int(M['m01']/M['m00'])
        print(x, y) 
        return x,y        
    except:
        print 'no objects'
        return 0,0    
def Move(x,y):
    global second
    #stop
    if x==0 and y==0:
        Stop()
    #go ahead
    elif width/4 <x and x<(width-width/4):
        Front(70)
    #left
    elif x < width/4:
        Left(50)
    #Right
    elif x > (width-width/4):
        Right(50)   
if __name__ == '__main__':
    Init()    
    set_servo_angle(4, 110)     #top servo     lengthwise
    #0:back    180:front    
    set_servo_angle(5, 90)     #bottom servo  crosswise
    #0:left    180:right      
    while 1:
        # 1 Image Process
        img, contours = Image_Processing() 
        # 2 get coordinates
        x, y = Get_Coord(img, contours)
        # 3 Move
        Move(x,y)       
        # must include this codes(otherwise you can't open camera successfully)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            Stop()
            GPIO.cleanup()    
            break    
    #Front(50)
    #Back(50)
    #$Left(50)
    #Right(50)
    #time.sleep(1)
    #Stop()
 

檢測原理是基于最大輪廓的檢測,沒有用深度學習的分類,所以容易受到干擾,后期學完深度學習會繼續(xù)優(yōu)化。有意見或者想法的朋友歡迎交流。

以上就是OpenCV物體跟蹤樹莓派視覺小車實現(xiàn)過程學習的詳細內(nèi)容,更多關于OpenCV物體跟蹤樹莓派視覺小車的資料請關注腳本之家其它相關文章!

相關文章

  • 利用python計算windows全盤文件md5值的腳本

    利用python計算windows全盤文件md5值的腳本

    這篇文章主要介紹了利用python計算windows全盤文件md5值的腳本,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Django 多語言教程的實現(xiàn)(i18n)

    Django 多語言教程的實現(xiàn)(i18n)

    這篇文章主要介紹了Django 多語言教程的實現(xiàn)(i18n),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • python實現(xiàn)json文件的增刪改操作方法

    python實現(xiàn)json文件的增刪改操作方法

    這篇文章主要介紹了python實現(xiàn)json文件的增刪改操作,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • python?Sweetviz探索性數(shù)據(jù)可視化分析庫使用特征詳解

    python?Sweetviz探索性數(shù)據(jù)可視化分析庫使用特征詳解

    這篇文章主要為大家介紹了python?Sweetviz探索性數(shù)據(jù)可視化分析庫特征使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Python高并發(fā)和多線程有什么關系

    Python高并發(fā)和多線程有什么關系

    這篇文章主要介紹了Python高并發(fā)和多線程有什么關系,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • 基于PyQt5制作一個PDF文件合并器

    基于PyQt5制作一個PDF文件合并器

    PDF文件合并工具是非常好用可以把多個pdf文件合并成一個,本文將利用Python中的PyQT5模塊,制作一個簡易的PDF文件合并器,感興趣的可以了解一下
    2022-03-03
  • Python解析json文件相關知識學習

    Python解析json文件相關知識學習

    JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。接下來通過本文給大家介紹python解析json文件相關知識,對python解析json文件相關知識感興趣的朋友一起學習吧
    2016-03-03
  • 解決python文件字符串轉(zhuǎn)列表時遇到空行的問題

    解決python文件字符串轉(zhuǎn)列表時遇到空行的問題

    下面小編就為大家?guī)硪黄鉀Qpython文件字符串轉(zhuǎn)列表時遇到空行的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Django組件之cookie與session的使用方法

    Django組件之cookie與session的使用方法

    這篇文章主要介紹了Django組件之cookie與session的使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 詳解Python IO口多路復用

    詳解Python IO口多路復用

    這篇文章主要介紹了Python IO口多路復用的的相關資料,文中講解的非常細致,幫助大家更好的理解和學習,感興趣的朋友可以參考下
    2020-06-06

最新評論

龙里县| 宜章县| 阿勒泰市| 大余县| 开封县| 平湖市| 香河县| 中西区| 平湖市| 铜山县| 韶山市| 广平县| 清远市| 沾益县| 会昌县| 巩义市| 习水县| 南皮县| 盐亭县| 乌鲁木齐县| 灵寿县| 会昌县| 新兴县| 石林| 东山县| 武定县| 桦川县| 上高县| 汉寿县| 丹江口市| 依安县| 白城市| 包头市| 涿鹿县| 木里| 镇赉县| 凉城县| 高邑县| 永仁县| 巫溪县| 宜良县|