0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

如何制作計算機視覺貓灑水器

454398 ? 來源:wv ? 2019-09-03 17:07 ? 次閱讀

第1步:主要項目必需

Raspberry Pi zero& SD

Raspberry Pi攝像機

繼電器

555計時器。..。(如果您的555計時器未到達,則為arduino和另一個繼電器)

電磁閥

灑水器

電子產(chǎn)品的某種外殼

愿意用6噸大錘打一個隱喻釘子

分辨率很低的相機你幾乎看不到水,但仍然可以看到貓跑來掩護

第2步:系統(tǒng)

1,Pi相機檢測到一個貓大小的物體移動幾個相機幀(下一步驟中已經(jīng)開始)

2,Pi啟動噴水器

3,Cat跑步封面

4,視頻自動上傳到y(tǒng)outube以便查看樂趣

第3步:編碼時間

使用openCV使用幀減法,您可以找到隨時間變化的幀的區(qū)域,使用一些漂亮的函數(shù),您可以確定這些變化有多大以及它們是否會持續(xù)存在,最重要的是找出它們是否是貓大小。

有相當?shù)腶f關(guān)于幀減法的新教程,如果你進行快速谷歌搜索,會詳細介紹。

代碼工作原理概述

1,相機不斷拍攝幀并將它們與最后

2,如果檢測到貓大小的形狀,則注意到

3,如果貓大小的變化持續(xù)超過4幀,則pi使用其GPIO為繼電器供電以啟動arduino

4,arduino發(fā)送信號給第二個繼電器供電5秒鐘,激活電磁閥

5,電磁閥通電時允許水進入噴水器

6,當噴水器處于活動狀態(tài)時,攝像頭停止檢測并記錄視頻

7,視頻上傳到Y(jié)outube

8,靜止圖像上傳到保管箱以進行微調(diào)系統(tǒng)

注意 - 為什么我最終使用2個繼電器和一個arduino打開電磁閥5秒鐘。..。..。

1,pi錄制視頻時pi不能啟動和停止電磁閥scrips暫停直到視頻結(jié)束,因此需要arduino(或555計時器)允許當視頻仍在錄制時,電磁鐵打開和關(guān)閉獨立于腳本。

2,第一個繼電器和arduino可以用555定時器替換,但是沒有及時發(fā)布這個項目,555將節(jié)省大量的時間和金錢和步驟。

3,pi不能直接觸發(fā)螺線管,因為Pi GPIO工作在3.3v和51mA最大值,螺線管需要5V和更多觸發(fā)時不超過51mA。

4,可以裁剪每個幀以去除不需要的區(qū)域中的運動檢測,例如neigbors garden。如果不這樣做會導致鄰居給你的花園帶來困惑的看法,因為每次他想進入他的棚子時灑水器就會熄火。

5,我可能錯過了一些明顯的東西,浪費了我的時間來設置它像這樣。

以下代碼

import cv2

import numpy as np

import argparse #cat

import time

import RPi.GPIO as GPIO

import os

import dropbox

from picamera.array import PiRGBArray

from picamera import PiCamera

#------------------------------------------------Upload to youtube---------------------------------------

def HDtoYoutube():

ctime = time.strftime(“_%H-%M-%S”)

cdate = time.strftime(“_%d-%m-%Y”)

vidname = ctime + cdate

#Trigger relay

GPIO.output(11,True)

time.sleep(.5)

GPIO.output(11,F(xiàn)alse)

print(“Taking Video”)

try:

#Take Video

os.system(‘raspivid -w 1640 -h 922 -o vid{0}.h264 -t 15000’.format(vidname))

#Upload to youtube

print(“Uploading to YouTube”)

os.system(‘sudo youtube-upload --title=“Cat Got Wet {0}” --client-secrets=client_secret.json vid{0}.h264’.format(vidname))

#Remove video file when done

os.remove(‘vid{0}.h264’.format(vidname))

print(“Video uploaded and removed from Pi”)

except:

pass

#------------------------------------------------Stills to dropbox---------------------------------------

def StillsToDropbox():

print(“Uploading Still To Dropbox Function”)

access_token = ‘Ah ah ah, you didn’t say the magic word.。.Ah ah ah, you didn‘t say the magic word’

ctime = time.strftime(“%H:%M:%S”)

cdate = time.strftime(“%d-%m-%Y”)

try:

filename = “/Motion/{0}/DetectedAt_{1}.jpg”.format(cdate, ctime)

print(filename)

client = dropbox.client.DropboxClient(access_token)

image = open(“ToDropbox.jpg”, ‘rb’)

client.put_file(filename, image)

image.close()

os.remove(“ToDropbox.jpg”)

except:

pass

#------------------------------------------------Detect motion-----------------------------------------

def DetectMotion():

#Define vars

min_area = 400

tolarance = 25 #change in pixel

bluramount = 21

timetoforget = 0.5

kernel = np.ones((5,5),np.uint8) #used for dialate

MotionCounter = 0

MinTargetArea = 600 #smallest size to detect

MaxTargetArea = 5000 #Largest size to detect

now = time.time()

then = time.time()

#initialise camera

camera = PiCamera()

camera.resolution = (640,480)

camera.framerate = 10

rawCapture = PiRGBArray(camera, size=(640,480))

#warmup camera

time.sleep(1)

#Grab first frame & prep it to go into cv2.acumulate weight

camera.capture(rawCapture, format=“bgr”)

avg = rawCapture.array

#Crop out unwanted region

PolyCrop = np.array( [[[362,480],[613,365],[628,161],[498,0],[640,0],[640,480]]], dtype=np.int32 )

cv2.fillPoly(avg, PolyCrop, 0,0,0)

#Process image

avg = cv2.cvtColor(avg, cv2.COLOR_BGR2GRAY)

avg = cv2.GaussianBlur(avg, (bluramount, bluramount), 0)

avg = avg.copy().astype(“float”)

rawCapture.truncate(0)

print(“Ready to detect”)

#capture frames

for frame in camera.capture_continuous(rawCapture, format=“bgr”, use_video_port=True):

#Pause Switch

loopgo = GPIO.input(PauseNow)

#print(loopgo)

while loopgo == 0:

#print(loopgo)

loopgo = GPIO.input(PauseNow)

time.sleep(1)

#grabs raw numpy array

currentframe = frame.array

key = cv2.waitKey(1) & 0xFF

#Crop out unwanted region

cv2.fillPoly(currentframe, PolyCrop, 0,0,0)

rawCapture.truncate(0) #Clear frame buffer for next loop

currentgray = cv2.cvtColor(currentframe, cv2.COLOR_BGR2GRAY)

currentgray = cv2.GaussianBlur(currentgray, (bluramount, bluramount), 0)

#make time average frame

cv2.accumulateWeighted(currentgray, avg, timetoforget)

#get difference in frame

frameDelta = cv2.absdiff(currentgray, cv2.convertScaleAbs(avg))

thresh = cv2.threshold(frameDelta, tolarance, 255, cv2.THRESH_BINARY)[1]

#Turn to blob

thresh = cv2.dilate(thresh, kernel, iterations = 10) #dilate

thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) #close holes

thresh = cv2.erode(thresh, kernel, iterations = 5) #erode

#contours

_, cnts, _= cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# loop over the contours

for c in cnts:

# if the contour is too small, ignore it

if cv2.contourArea(c) 《 min_area:

continue

# compute the bounding box for the contour, draw it on the frame,

# and update the textq

(x, y, w, h) = cv2.boundingRect(c)

#Too small : Red Box

if cv2.contourArea(c) 《 MinTargetArea:

cv2.rectangle(currentframe, (x, y), (x + w, y + h), (0, 0, 255), 2)

#MotionCounter = MotionCounter + 1 #Debug take all the pictures

print(“MotionDetected”)

#Just right : Green Box

if cv2.contourArea(c) 》= MinTargetArea and cv2.contourArea(c) 《= MaxTargetArea:

cv2.rectangle(currentframe, (x, y), (x + w, y + h), (0, 255, 0), 2)

MotionCounter = MotionCounter + 1 #Debug take all the pictures

print(“MotionDetected”)

#Too big : Blue Box

if cv2.contourArea(c) 》 MaxTargetArea:

cv2.rectangle(currentframe, (x, y), (x + w, y + h), (255, 0, 0), 2)

#MotionCounter = MotionCounter + 1 #Debug take all the pictures

print(“MotionDetected”)

#Keep now up to date

now = time.time()

#MotionCounterTimer

if (MotionCounter 》 0):

if (now - then 》 10):

MotionCounter = 0

then = time.time()

#Break loop on pressing Q

if key == ord(“q”):

break

#If motion persists save current frame and activate countermeasures

if MotionCounter 》= 4:

MotionCounter = 0

cv2.imwrite(‘ToDropbox.jpg’, currentframe)

camera.close()

return True

#------------------------------------------------Main---------------------------------------

try:

#Set Pins

GPIO.setmode(GPIO.BOARD)

PauseNow=12

GPIO.setup(11,GPIO.OUT)

GPIO.setup(PauseNow,GPIO.IN,pull_up_down=GPIO.PUD_UP)

while True:

MotionDetected = False

MotionDetected = DetectMotion()

if MotionDetected == True:

HDtoYoutube()

StillsToDropbox()

except KeyboardInterrupt:

print(“Keyboard Interupt”)

except:

print(“Other Error”)

finally:

GPIO.cleanup()

#HowToTriggerRealProgrammersWithBadCode

第4步:將它放在一起

將電器塞入防水外殼,將物品擰入墻壁并使用大量膠帶和熱膠

第5步:結(jié)果

什么時候有效

第6步:誤報

如果沒有,它會噴射貓影,你的妻子和你的女兒。

Pro -tip - 在門旁邊放一個開關(guān),暫停運動檢測程序。..。.然后忘記使用它并在放入垃圾箱時弄濕。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 計算機視覺
    +關(guān)注

    關(guān)注

    8

    文章

    1699

    瀏覽量

    46050
  • 智能灑水器
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1090
收藏 人收藏

    評論

    相關(guān)推薦

    計算機視覺有哪些優(yōu)缺點

    計算機視覺作為人工智能領域的一個重要分支,旨在使計算機能夠像人類一樣理解和解釋圖像和視頻中的信息。這一技術(shù)的發(fā)展不僅推動了多個行業(yè)的變革,也帶來了諸多優(yōu)勢,但同時也伴隨著一些挑戰(zhàn)和局限性。以下是對
    的頭像 發(fā)表于 08-14 09:49 ?1053次閱讀

    計算機視覺技術(shù)的AI算法模型

    計算機視覺技術(shù)作為人工智能領域的一個重要分支,旨在使計算機能夠像人類一樣理解和解釋圖像及視頻中的信息。為了實現(xiàn)這一目標,計算機視覺技術(shù)依賴于
    的頭像 發(fā)表于 07-24 12:46 ?1004次閱讀

    機器視覺計算機視覺有什么區(qū)別

    機器視覺計算機視覺是兩個密切相關(guān)但又有所區(qū)別的概念。 一、定義 機器視覺 機器視覺,又稱為計算機
    的頭像 發(fā)表于 07-16 10:23 ?573次閱讀

    計算機視覺的五大技術(shù)

    計算機視覺作為深度學習領域最熱門的研究方向之一,其技術(shù)涵蓋了多個方面,為人工智能的發(fā)展開拓了廣闊的道路。以下是對計算機視覺五大技術(shù)的詳細解析,包括圖像分類、對象檢測、目標跟蹤、語義分割
    的頭像 發(fā)表于 07-10 18:26 ?1463次閱讀

    計算機視覺的工作原理和應用

    計算機視覺(Computer Vision,簡稱CV)是一門跨學科的研究領域,它利用計算機和數(shù)學算法來模擬人類視覺系統(tǒng)對圖像和視頻進行識別、理解、分析和處理。其核心目標在于使
    的頭像 發(fā)表于 07-10 18:24 ?2163次閱讀

    機器人視覺計算機視覺的區(qū)別與聯(lián)系

    ,而計算機視覺則更側(cè)重于從圖像和視頻中提取信息。盡管它們在某些方面有所重疊,但它們在目標、方法和應用上存在明顯差異。 2. 機器人視覺概述 機器人視覺是指機器人利用
    的頭像 發(fā)表于 07-09 09:27 ?705次閱讀

    計算機視覺與人工智能的關(guān)系是什么

    引言 計算機視覺是一門研究如何使計算機能夠理解和解釋視覺信息的學科。它涉及到圖像處理、模式識別、機器學習等多個領域的知識。人工智能則是研究如何使計算
    的頭像 發(fā)表于 07-09 09:25 ?706次閱讀

    計算機視覺與智能感知是干嘛的

    引言 計算機視覺(Computer Vision)是一門研究如何使計算機能夠理解和解釋視覺信息的學科。它涉及到圖像處理、模式識別、機器學習等多個領域,是人工智能的重要組成部分。智能
    的頭像 發(fā)表于 07-09 09:23 ?996次閱讀

    計算機視覺和機器視覺區(qū)別在哪

    計算機視覺和機器視覺是兩個密切相關(guān)但又有明顯區(qū)別的領域。 一、定義 計算機視覺 計算機
    的頭像 發(fā)表于 07-09 09:22 ?486次閱讀

    計算機視覺和圖像處理的區(qū)別和聯(lián)系

    計算機視覺和圖像處理是兩個密切相關(guān)但又有明顯區(qū)別的領域。 1. 基本概念 1.1 計算機視覺 計算機視覺
    的頭像 發(fā)表于 07-09 09:16 ?1392次閱讀

    計算機視覺屬于人工智能嗎

    屬于,計算機視覺是人工智能領域的一個重要分支。 引言 計算機視覺是一門研究如何使計算機具有視覺
    的頭像 發(fā)表于 07-09 09:11 ?1360次閱讀

    深度學習在計算機視覺領域的應用

    隨著人工智能技術(shù)的飛速發(fā)展,深度學習作為其中的核心技術(shù)之一,已經(jīng)在計算機視覺領域取得了顯著的成果。計算機視覺,作為計算機科學的一個重要分支,
    的頭像 發(fā)表于 07-01 11:38 ?882次閱讀

    機器視覺計算機視覺的區(qū)別

    在人工智能和自動化技術(shù)的快速發(fā)展中,機器視覺(Machine Vision, MV)和計算機視覺(Computer Vision, CV)作為兩個重要的分支領域,都扮演著至關(guān)重要的角色。盡管它們在
    的頭像 發(fā)表于 06-06 17:24 ?1378次閱讀

    計算機視覺的主要研究方向

    計算機視覺(Computer Vision, CV)作為人工智能領域的一個重要分支,致力于使計算機能夠像人眼一樣理解和解釋圖像和視頻中的信息。隨著深度學習、大數(shù)據(jù)等技術(shù)的快速發(fā)展,計算機
    的頭像 發(fā)表于 06-06 17:17 ?1037次閱讀

    計算機視覺的十大算法

    隨著科技的不斷發(fā)展,計算機視覺領域也取得了長足的進步。本文將介紹計算機視覺領域的十大算法,包括它們的基本原理、應用場景和優(yōu)缺點。這些算法在圖像處理、目標檢測、人臉識別等領域有著廣泛的應
    的頭像 發(fā)表于 02-19 13:26 ?1287次閱讀
    <b class='flag-5'>計算機</b><b class='flag-5'>視覺</b>的十大算法