作者/攝影 |
曾吉弘 |
時間 |
3小時 |
成本 |
|
難度 |
* * * * |
材料表 |
- 個人電腦
- Webcam 或筆電內建攝影鏡頭
- Processing IDE
|
本文要介紹如何在 Processing 中匯入OpenCV視覺函式庫,並做到臉孔追蹤的效果。
這比建置完整的OpenCV環境做法簡單多了,但是功能相對也會比完整的openCV環境來得少,就看您個人的需求囉。其實 Processing 的程式碼都很簡潔,也很容易做出漂亮的介面,是阿吉老師上課很喜歡的。Processing結合Arduino也很簡單。
硬體
請將#1伺服機的訊號腳位接到Arduino的#9腳位,用於控制PTZ平台的水平方向移動(Pan)
請將#2伺服機的訊號腳位接到Arduino的#11腳位,用於控制PTZ平台的垂直方向移動(Tilt)。其餘分別接電接地完成即可。
View post on imgur.com
示意圖(圖片來源 adafruit 與 sparkfun.com):
View post on imgur.com
View post on imgur.com
您可由 thingiverse這樣的網站找到更多的PTZ平台設計
Processing設定
1.下載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();
}
執行
由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
相關文章: