【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相關控制碼

import gab.opencv.*;
import processing.video.*;
import java.awt.*;
import processing.serial.*;
import cc.arduino.*;

int center_x, center_y;
Arduino arduino;

Capture video;
OpenCV opencv;

void setup() {
size(640, 480);
video = new Capture(this, 640/2, 480/2);
opencv = new OpenCV(this, 640/2, 480/2);
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
println(Arduino.list());

arduino = new Arduino(this, Arduino.list()[0], 57600);
//0代表第一個COM裝置,請根據實際狀況修改
arduino.pinMode(9, Arduino.SERVO); //#1 servo 水平
arduino.pinMode(11, Arduino.SERVO); //#2 servo 垂直
video.start();
}

void draw() {
scale(2);
opencv.loadImage(video);

image(video, 0, 0 );

noFill();
stroke(0, 255, 0);
strokeWeight(2);
Rectangle[] faces = opencv.detect(); //偵測是否有臉
println(faces.length); //偵測到幾張臉

for (int i = 0; i < faces.length; i++) { //根據臉孔數目來跑迴圈
println(faces[i].x + "," + faces[i].y); //顯示臉的座標
rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height); //畫長方形把臉框出來
center_x = faces[i].x + (faces[i].width/2); //起始點x + 0.5*寬
center_y = faces[i].y + (faces[i].height /2); //起始點y + 0.5*高
print(center_x);
print(", ");
println(center_y);
ellipse(center_x, center_y, 10, 10);
arduino.servoWrite(9, int(map(center_x, 100, 270, 0, 180)));
//本組數值是center_x 於畫面之左右極值,需依照實際情況調整
arduino.servoWrite(11, int(map(center_y, 80, 250, 0, 180)));
//本組數值是center_y 於畫面的上下極值,需依照實際情況調整
}
delay(100);
}

void captureEvent(Capture c) {
c.read();
}

執行

 

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

OpenCV for Processing 0.5.4 by Greg Borenstein http://gregborenstein.com

Using Java OpenCV 2.4.5.0

Load cascade from: C:/Users/user/Documents/Processing/libraries/opencv_processing/library/cascade-files/haarcascade_frontalface_alt.xml

Cascade loaded: haarcascade_frontalface_alt.xml

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

View post on imgur.com

View post on imgur.com

相關文章:

 

 

 

 

 

發佈留言

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