2016-09-07 5 views
0

私はウェブカメラ、arduino、ラズベリーとIR近接センサを使用する必要があるプロジェクトに取り組んでいます。私はgoogleの助けを借りてすべてをすることになった。しかし、私は本当に大きな問題を抱えています。 私は処理にOpenCVライブラリを使用しています。ウェブカメラで取得した輪郭をスケッチの中心にしたいと思います。しかし、すべてはビデオを動かすためだけに到着し、輪郭は私のコードではありません。 私はあなたが私を助けることができるいただければ幸いです:)"findcontour"での輪郭位置処理時opencv

あなたが使用できるすべてのベスト

アレクサンドル

//////////////////////////////////////////// 
////////////////////////////////// LIBRARIES 
//////////////////////////////////////////// 

import processing.serial.*; 
import gab.opencv.*; 
import processing.video.*; 




///////////////////////////////////////////////// 
////////////////////////////////// INITIALIZATION 
///////////////////////////////////////////////// 

Movie mymovie; 
Capture video; 
OpenCV opencv; 
Contour contour; 




//////////////////////////////////////////// 
////////////////////////////////// VARIABLES 
//////////////////////////////////////////// 

int lf = 10; // Linefeed in ASCII 
String myString = null; 
Serial myPort; // The serial port 
int sensorValue = 0; 
int x = 300; 




///////////////////////////////////////////// 
////////////////////////////////// VOID SETUP 
///////////////////////////////////////////// 

void setup() { 
    size(1280, 1024); 
    // List all the available serial ports 
    printArray(Serial.list()); 
    // Open the port you are using at the rate you want: 
    myPort = new Serial(this, Serial.list()[1], 9600); 
    myPort.clear(); 
    // Throw out the first reading, in case we started reading 
    // in the middle of a string from the sender. 
    myString = myPort.readStringUntil(lf); 
    myString = null; 
    opencv = new OpenCV(this, 720, 480); 
    video = new Capture(this, 720, 480); 
    mymovie = new Movie(this, "visage.mov"); 
    opencv.startBackgroundSubtraction(5, 3, 0.5); 
    mymovie.loop(); 
} 




//////////////////////////////////////////// 
////////////////////////////////// VOID DRAW 
//////////////////////////////////////////// 

void draw() { 
    image(mymovie, 0, 0); 
    image(video, 20, 20); 
    //tint(150, 20); 
    noFill(); 
    stroke(255, 0, 0); 
    strokeWeight(1); 



    // check if there is something new on the serial port 
    while (myPort.available() > 0) { 
    // store the data in myString 
    myString = myPort.readStringUntil(lf); 
    // check if we really have something 
    if (myString != null) { 
     myString = myString.trim(); // let's remove whitespace characters 
     // if we have at least one character... 
     if (myString.length() > 0) { 
     println(myString); // print out the data we just received 
     // if we received a number (e.g. 123) store it in sensorValue, we sill use this to change the background color. 
     try { 
      sensorValue = Integer.parseInt(myString); 
     } 
     catch(Exception e) { 
     } 
     } 
    } 
    } 
    if (x < sensorValue) { 
    video.start(); 
    opencv.loadImage(video); 
    } 

    if (x > sensorValue) { 
    image(mymovie, 0, 0); 
    } 

    opencv.updateBackground(); 
    opencv.dilate(); 
    opencv.erode(); 

    for (Contour contour : opencv.findContours()) { 
    contour.draw(); 
    } 

} 




////////////////////////////////////////////// 
////////////////////////////////// VOID CUSTOM 
////////////////////////////////////////////// 

void captureEvent(Capture video) { 
    video.read(); // affiche l'image de la webcam 
} 

void movieEvent(Movie myMovie) { 
    myMovie.read(); 
} 
+0

クロスポストをリンクしてください:https://forum.processing.org/two/discussion/18103/how-to-change-position-of-contour-opencv –

答えて

0

一つのアプローチは、キャ​​ンバスの起源を移動するtranslate()関数を呼び出すことですcontour.draw()に電話する前に。このような何か:

translate(moveX, moveY); 

for (Contour contour : opencv.findContours()) { 
    contour.draw(); 
} 

何がmoveXmoveYに使用することはあなたが何をしようとしている正確に何に完全に依存します。あなたはビデオを描画するために使用している位置を使用することができます(輪郭をビデオの上に表示したい場合)、またはwidth/2height/2(実際には輪郭を中央に置くにはちょっとマイナスです)を使用します。

さらに詳しい情報はthe referenceにあります。さまざまな値で遊んでください。つまったらMCVEを投稿してください。がんばろう。

+0

こんにちはケビン、ありがとう(); "あなたが言ったようにwidth/xとheight/xを使ってください。 もう一度ありがとうございます:) – Alexandre