【Processing匯入OpneCV視覺函式庫】臉孔追蹤小專題

作者/攝影   曾吉弘
時間   3小時
難度

★★★★☆

材料表
  • 個人電腦
  • Webcam 或筆電內建攝影鏡頭
  • Processing IDE
  • Arduino UNO 開發板
  • 麵包板
  • 線材
  • sg90 伺服機 x 2

本文要介紹如何在 Processing IDE 中匯入OpenCV視覺函式庫,並做到臉孔追蹤的效果。

這比建置完整的OpenCV環境做法簡單多了,但是功能相對也會比完整的 openCV 環境來得少,就看您個人的需求囉。其實 Processing 的程式碼都很簡潔,也很容易做出漂亮的介面,是阿吉老師上課很喜歡的。Processing結合Arduino也很簡單。

硬體

請將#1伺服機的訊號腳位接到Arduino的#9腳位,用於控制PTZ平台的水平方向移動(Pan)

請將#2伺服機的訊號腳位接到Arduino的#11腳位,用於控制PTZ平台的垂直方向移動(Tilt)。其餘分別接電接地完成即可。您可由 thingiverse這樣的網站找到更多的PTZ平台設計

View post on imgur.com

示意圖(圖片來源 adafruit 與 sparkfun.com):

View post on imgur.com

View post on imgur.com

Processing設定

1.下載 Processing IDE。請根據您的作業系統下載對應版本的 Processing IDE,下載後解壓縮免安裝就能執行 Processing 環境。

2.開啟 Sketch → Import Library…  找到 Add Library:在跳出選單中搜尋並下載 openCV 與  processing video函式庫

View post on imgur.com

View post on imgur.com

View post on imgur.com

3.下載Arduino函式庫,完成之後可以在 File → Examples 看到相關範例,都可以直接玩玩看喔

View post on imgur.com

4.開啟範例程式:LiveCamTest,可以直接追蹤臉孔囉,以下是我們加入Arduino相關控制碼

[pastacode lang=”java” manual=”import%20gab.opencv.*%3B%0Aimport%20processing.video.*%3B%0Aimport%20java.awt.*%3B%0Aimport%20processing.serial.*%3B%0Aimport%20cc.arduino.*%3B%0A%0Aint%20center_x%2C%20center_y%3B%0AArduino%20arduino%3B%0A%0ACapture%20video%3B%0AOpenCV%20opencv%3B%0A%0Avoid%20setup()%20%7B%0A%20%20size(640%2C%20480)%3B%20%20%0A%20%20video%20%3D%20new%20Capture(this%2C%20640%2F2%2C%20480%2F2)%3B%0A%20%20opencv%20%3D%20new%20OpenCV(this%2C%20640%2F2%2C%20480%2F2)%3B%0A%20%20opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE)%3B%20%20%0A%20%20println(Arduino.list())%3B%0A%0A%20%20arduino%20%3D%20new%20Arduino(this%2C%20Arduino.list()%5B0%5D%2C%2057600)%3B%20%0A%20%20%2F%2F0%E4%BB%A3%E8%A1%A8%E7%AC%AC%E4%B8%80%E5%80%8BCOM%E8%A3%9D%E7%BD%AE%EF%BC%8C%E8%AB%8B%E6%A0%B9%E6%93%9A%E5%AF%A6%E9%9A%9B%E7%8B%80%E6%B3%81%E4%BF%AE%E6%94%B9%0A%20%20arduino.pinMode(9%2C%20Arduino.SERVO)%3B%20%20%20%20%20%2F%2F%231%20servo%20%E6%B0%B4%E5%B9%B3%0A%20%20arduino.pinMode(11%2C%20Arduino.SERVO)%3B%20%20%20%2F%2F%232%20servo%20%E5%9E%82%E7%9B%B4%0A%20%20video.start()%3B%0A%7D%0A%0Avoid%20draw()%20%7B%0A%20%20scale(2)%3B%0A%20%20opencv.loadImage(video)%3B%0A%0A%20%20image(video%2C%200%2C%200%20)%3B%0A%0A%20%20noFill()%3B%0A%20%20stroke(0%2C%20255%2C%200)%3B%0A%20%20strokeWeight(2)%3B%0A%20%20Rectangle%5B%5D%20faces%20%3D%20opencv.detect()%3B%20%20%20%2F%2F%E5%81%B5%E6%B8%AC%E6%98%AF%E5%90%A6%E6%9C%89%E8%87%89%0A%20%20println(faces.length)%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E5%81%B5%E6%B8%AC%E5%88%B0%E5%B9%BE%E5%BC%B5%E8%87%89%0A%0A%20%20for%20(int%20i%20%3D%200%3B%20i%20%3C%20faces.length%3B%20i%2B%2B)%20%7B%20%20%20%20%2F%2F%E6%A0%B9%E6%93%9A%E8%87%89%E5%AD%94%E6%95%B8%E7%9B%AE%E4%BE%86%E8%B7%91%E8%BF%B4%E5%9C%88%0A%20%20%20%20println(faces%5Bi%5D.x%20%2B%20%22%2C%22%20%2B%20faces%5Bi%5D.y)%3B%20%20%20%20%2F%2F%E9%A1%AF%E7%A4%BA%E8%87%89%E7%9A%84%E5%BA%A7%E6%A8%99%0A%20%20%20%20rect(faces%5Bi%5D.x%2C%20faces%5Bi%5D.y%2C%20faces%5Bi%5D.width%2C%20faces%5Bi%5D.height)%3B%20%2F%2F%E7%95%AB%E9%95%B7%E6%96%B9%E5%BD%A2%E6%8A%8A%E8%87%89%E6%A1%86%E5%87%BA%E4%BE%86%0A%20%20%20%20center_x%20%3D%20faces%5Bi%5D.x%20%2B%20(faces%5Bi%5D.width%2F2)%3B%20%20%20%2F%2F%E8%B5%B7%E5%A7%8B%E9%BB%9Ex%20%2B%200.5*%E5%AF%AC%0A%20%20%20%20center_y%20%3D%20faces%5Bi%5D.y%20%2B%20(faces%5Bi%5D.height%20%2F2)%3B%20%20%2F%2F%E8%B5%B7%E5%A7%8B%E9%BB%9Ey%20%2B%200.5*%E9%AB%98%0A%20%20%20%20print(center_x)%3B%20%0A%20%20%20%20print(%22%2C%20%22)%3B%20%0A%20%20%20%20println(center_y)%3B%0A%20%20%20%20ellipse(center_x%2C%20center_y%2C%2010%2C%2010)%3B%0A%20%20%20%20arduino.servoWrite(9%2C%20int(map(center_x%2C%20100%2C%20270%2C%200%2C%20180)))%3B%20%20%0A%20%20%20%20%2F%2F%E6%9C%AC%E7%B5%84%E6%95%B8%E5%80%BC%E6%98%AFcenter_x%20%E6%96%BC%E7%95%AB%E9%9D%A2%E4%B9%8B%E5%B7%A6%E5%8F%B3%E6%A5%B5%E5%80%BC%EF%BC%8C%E9%9C%80%E4%BE%9D%E7%85%A7%E5%AF%A6%E9%9A%9B%E6%83%85%E6%B3%81%E8%AA%BF%E6%95%B4%0A%20%20%20%20arduino.servoWrite(11%2C%20int(map(center_y%2C%2080%2C%20250%2C%200%2C%20180)))%3B%20%20%0A%20%20%20%20%2F%2F%E6%9C%AC%E7%B5%84%E6%95%B8%E5%80%BC%E6%98%AFcenter_y%20%E6%96%BC%E7%95%AB%E9%9D%A2%E7%9A%84%E4%B8%8A%E4%B8%8B%E6%A5%B5%E5%80%BC%EF%BC%8C%E9%9C%80%E4%BE%9D%E7%85%A7%E5%AF%A6%E9%9A%9B%E6%83%85%E6%B3%81%E8%AA%BF%E6%95%B4%0A%20%20%7D%0A%20%20delay(100)%3B%0A%7D%0A%0Avoid%20captureEvent(Capture%20c)%20%7B%0A%20%20c.read()%3B%0A%7D%0A” message=”” highlight=”” provider=”manual”/]

執行

 

由 Processing console 的訊息可以看到以下訊息:

[pastacode lang=”bash” manual=”OpenCV%20for%20Processing%200.5.4%20by%20Greg%20Borenstein%20http%3A%2F%2Fgregborenstein.com%0A%0AUsing%20Java%20OpenCV%202.4.5.0%0A%0ALoad%20cascade%20from%3A%20C%3A%2FUsers%2Fuser%2FDocuments%2FProcessing%2Flibraries%2Fopencv_processing%2Flibrary%2Fcascade-files%2Fhaarcascade_frontalface_alt.xml%0A%0ACascade%20loaded%3A%20haarcascade_frontalface_alt.xml” message=”” highlight=”” provider=”manual”/]

代表在此的臉孔追蹤還是用到了Haar分類演算法,點選連結可以看到關於本分類法的數理基礎。執行畫面如下,可以看到畫面會把偵測到的臉孔標出來,也會在console中顯示偵測到的臉孔張數與座標

View post on imgur.com

View post on imgur.com

相關文章:

 

 

 

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *