一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - OpenCV物體跟蹤樹莓派視覺小車實(shí)現(xiàn)過程學(xué)習(xí)

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

2022-01-25 00:34_睿智_ Python

這篇文章主要介紹了OpenCV物體跟蹤樹莓派視覺小車的實(shí)現(xiàn)過程學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

物體跟蹤效果展示

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

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

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

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

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

過程:

 

一、初始化

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()

 

二、運(yùn)動(dòng)控制函數(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

 

三、舵機(jī)角度控制

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):是頂部的舵機(jī)(攝像頭上下擺動(dòng)的那個(gè)舵機(jī))

下面的(5):是底部的舵機(jī)(攝像頭左右擺動(dòng)的那個(gè)舵機(jī))

 

四、攝像頭&&圖像處理

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

1、打開攝像頭

打開攝像頭,并設(shè)置窗口大小。

設(shè)置小窗口的原因: 小窗口實(shí)時(shí)性比較好。

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

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

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

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

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

3、 高斯濾波(去噪)

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

4、亮度增強(qiáng)

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

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

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

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

6、閉運(yùn)算處理

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

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

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)

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

代碼

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

 

五、獲取最大輪廓坐標(biāo)

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

# 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

返回最大輪廓的坐標(biāo):

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

 

六、運(yùn)動(dòng)

根據(jù)反饋回來的坐標(biāo),判斷它的位置,進(jìn)行運(yùn)動(dòng)。

# 3 Move
      Move(x,y)

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

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

2、向前走

識(shí)別到物體,且在正中央(中間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()

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

以上就是OpenCV物體跟蹤樹莓派視覺小車實(shí)現(xiàn)過程學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于OpenCV物體跟蹤樹莓派視覺小車的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://blog.csdn.net/great_yzl/article/details/120338859

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美亚洲国产精品久久第一页 | 多人群p全肉小说 | 美妇在线 | 欧美一区二区三区综合色视频 | 免费免费啪视频在线观播放 | 成人免费一区二区三区在线观看 | 亚洲天堂视频在线播放 | 亚洲天堂男人网 | 午夜片无码区在线观看 | 午夜理论片YY4399影院 | 91精品国产高清久久久久久91 | 男人的天堂视频 | 青青操在线播放 | 我要看靠逼片 | 精品破处| 欧美日韩一区二区三区在线观看 | 亚洲精品国产精品麻豆99 | 精品无码久久久久久久动漫 | 国产综合视频在线 | 色香视频在线 | 波多野结衣 在线 | 午夜爱情动作片P | 日本一区二区不卡久久入口 | a级毛片毛片免费很很综合 a级黄色视屏 | 蜜桃破解版免费看nba | 久久久乱码精品亚洲日韩 | 欧美亚洲综合另类 | 国内永久第一免费福利视频 | 91视频完整版 | 国产91在线免费 | 欧美高清milf在线播放 | 国产一级黄毛片 | 四虎在线最新永久免费 | 日韩欧美亚洲一区二区综合 | 日本人护士免费xxxx视频 | 风间由美在线播放 | 国产精品久久毛片蜜月 | 日本四虎影院 | 厨房里摸着乳丰满在线观看 | 好猛好紧好硬使劲好大刺激视频 | 性夜影院午夜看片 |