2015-10-31 68 views
1

我正在製作一個項目,通過使用伺服器頂部的相機將您的臉保持在屏幕中央。我使用了arduino遊樂場網站上的簡單伺服控制教程,使用鼠標控制伺服並嘗試重寫它以使用臉部的x座標使伺服向所需的方向移動。Arduino伺服器使用arduino進行facetracking,處理和opencv

simple servo control arduino playground

到目前爲止,我得到了它與內置攝像頭的工作。舵機在我的臉上朝着正確的方向很好地移動。但是,只要在伺服器的頂部使用外置USB攝像頭而不是內置攝像頭,我就無法獲得理想的效果。相機不想看着我。只要它檢測到你的臉,它就會朝相反的方向直行。因此,如果相機在屏幕左側檢測到您的臉部,伺服器將向右轉動,直到臉部不在屏幕上。

我希望有人能夠回答或幫助我解釋爲什麼它可以與內置相機配合使用,但不是當我使用連接在伺服上的USB相機時。

我在處理中使用Arduino,Processing和OpenCV庫。

這是我到目前爲止的代碼:

的Arduino代碼:

#include <Servo.h> 

Servo servo1; Servo servo2; 

void setup() { 
servo1.attach(4); 
servo2.attach(10); 

Serial.begin(19200); 
Serial.println("Ready"); 
} 

void loop() { 

static int v = 0; 

if (Serial.available()) { 
    char ch = Serial.read(); 

    switch(ch) { 
    case '0'...'9': 
     v = v * 10 + ch - '0'; 
     /* 
      so if the chars sent are 45x (turn x servo to 45 degs).. 
      v is the value we want to send to the servo and it is currently 0 
      The first char (ch) is 4 so 
      0*10 = 0 + 4 - 0 = 4; 
      Second char is 4; 
      4*10 = 40 + 5 = 45 - 0 = 45; 
      Third char is not a number(0-9) so we drop through... 
     */ 
     break; 
    case 's': 
     servo1.write(v); 
     v = 0; 
     break; 
    case 'w': 
     servo2.write(v); 
     v = 0; 
     break; 
    case 'd': 
     servo2.detach(); 
     break; 
    case 'a': 
     servo2.attach(10); 
     break; 
    } 
} 
} 

我的處理代碼:

import gab.opencv.*; 
import processing.video.*; 
import java.awt.*; 

//---------------- 
import processing.serial.*; 

int gx = 15; 
int gy = 35; 
//int spos=90; 
float midden=90; 


float leftColor = 0.0; 
float rightColor = 0.0; 
Serial port; 
//---------------- 

Capture video; 
OpenCV opencv; 

void setup() { 
    size(640, 480); 


    String[] cameras = Capture.list(); 
    if (cameras.length == 0) { 
    println("There are no cameras available for capture."); 
    exit(); 
    } else { 
    println("Available cameras:"); 
    for (int i = 0; i < cameras.length; i++) { 
     println(cameras[i]); 
    } 
    } 

    //---------------- 
    colorMode(RGB, 1.0); 
    noStroke(); 

    frameRate(100); 

    //println(Serial.list()); // List COM-ports 

    //select second com-port from the list 
    port = new Serial(this, Serial.list()[5], 19200); //arduino aangesloten aan linker USB 
    //---------------- 

    video = new Capture(this, 640/2, 480/2, "USB2.0 Camera"); //external camera rechter USB 
    //video = new Capture(this, 640/2, 480/2); //built-in camera 
    opencv = new OpenCV(this, 640/2, 480/2); 
    opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); 

    video.start(); 
    //-_-_-_-_-_-_-_-_- weergave kleur camera 
    opencv.useColor(); 
} 

void draw() { 
    //---------------- Mouse Control 
    background(0.0); 
    update(mouseX); 
    fill(mouseX/4); 
    rect(150, 320, gx*2, gx*2); 
    fill(180 - (mouseX/4)); 
    rect(450, 320, gy*2, gy*2); 
    //---------------- 


    scale(2); 
    opencv.loadImage(video); 
    //-_-_-_-_-_-_-_-_- Flip camera image 
    opencv.flip(OpenCV.HORIZONTAL); 

    image(video, 0, 0); 


    //-_-_-_-_-_-_-_-_- 
    image(opencv.getOutput(), 0, 0); 

    noFill(); 
    stroke(0, 255, 0); 
    strokeWeight(3); 
    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); //groene vierkant om het gezicht 
    ellipse(faces[i].x + 0.5*faces[i].width, faces[i].y + 0.5*faces[i].height, 5, 5); //middenpunt v.h. gezicht 
    midden= (faces[i].x + 0.5*faces[i].width); 
    //midden= (faces[i].x); 
    } 
} 

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

    //---------------- servo controls voor muislocatie en draaiing servo 
void update(int x) 
{ 
    //Calculate servo postion from mouseX 
    //spos= x/4; 
    //Output the servo position (from 0 to 180) 
    port.write("s"+midden); 
    println(midden); 
// if(midden>80 && midden<150){ 
//  port.write("s"+90); 
// } else if(midden<80){ 
//  port.write("s"+45); 
// }else{ 
//  port.write("s"+135); 
// } 
} 
    //---------------- 

回答

1

這聽起來像兩個圖像翻轉。要測試這個,請嘗試在兩幅圖像的左側繪製一個圓圈(然後使用imshow進行顯示),以查看它們是否最終位於同一位置。

+0

對不起,我遲來的反應。 你是對的,視頻圖像翻轉。我從來沒有在處理過程中看到imshow這個術語,也無法在處理參考頁面找到它。所以我搜索瞭如何翻轉我的視頻圖像處理和碰到: pushMatrix(); 比例(-1,1); image(video,0,0); popMatrix(); 所以謝謝你的提示。我正在尋找一種方法來以另一種方式旋轉伺服器,但是多虧了我才找到解決方案來翻轉視頻圖像。 –