2016-09-12 14 views
-1

opencvとopenkinectライブラリで顔検出を構築しようとしています。画像入力のために私はxbox kinect v2を使いたいです。私はopencvライブラリ内の顔検出の例に私のコードを基づいています。私はMacで働いています。Opencv、open kinect、kinect v2で処理中の顔検出

これはこれまでのところ私のコードです:

import gab.opencv.*; 
import java.awt.Rectangle; 

/* KINECT */ 
import org.openkinect.freenect.*; 
import org.openkinect.freenect2.*; 
import org.openkinect.processing.*; 

OpenCV opencv; 
Kinect2 kinect2; 

Rectangle[] faces; 

void setup() { 
    opencv = new OpenCV(this, 640/2, 480/2); 
    size(640, 480); 
    // Kinectv2 
    kinect2 = new Kinect2(this); 
    kinect2.initVideo(); 
    kinect2.initDevice(); 

    opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); 
    faces = opencv.detect(); 
} 

void draw() { 
    opencv.loadImage(kinect2.getVideoImage()); 
    image(kinect2.getVideoImage(), 0, 0, 640, 480); 

    noFill(); 
    stroke(0, 255, 0); 
    strokeWeight(3); 
    for (int i = 0; i < faces.length; i++) { 
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height); 
    } 
} 

問題はラインであると思われる "opencv.loadImage(kinect2.getVideoImage());"検出が機能しないためです。 kinectの代わりに、ビルドイン関数 "capture"と "video" -add-onを使用して、isightカメラを操作すると、すべて正常に動作します。

誰でもお手伝いできますか?

+0

もっと具体的にする必要があります。問題がその行にあるようだと言うと、どういう意味ですか?それがうまくいかないと言ったらどういう意味ですか?何が起こると思いますか?代わりに何が起こるのですか?異なる行為はどの行のコードから始まるのですか? –

+0

opencv.loadImage(kinect2.getVideoImage()); //ここで私はopencvが動作していないkinectによって記録されたビジュアルデータを処理することを期待しています。 "問題はその行になければならない"と言うと、opencvは関数 "kinect2.getVideoImage()"から取得したデータを処理できず、別のフォームが必要になることがあります入力の。 image(kinect2.getVideoImage()、0、0、640、480); //ここで私はxbox kinectで記録されたビジュアルデータの出力を期待しています。 – mindcraft

答えて

1

今後、MCVEをお送りください。つまり、空白のスケッチから始めて、問題を見るために十分なコードを追加するだけです。あなたの場合、私たちはkinectコードを見る必要はありません。ハードコーディングされた画像をロードし、OpenCVに渡すだけです。

これはまさにそれを行うスケッチの例です。 human Wikipedia pageから画像URLを取得しました。

import gab.opencv.*; 
import java.awt.Rectangle; 

PImage image; 
OpenCV opencv; 

void setup() { 
    size(500, 500); 
    image = loadImage("https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/A_young_Man_and_Lady.png/800px-A_young_Man_and_Lady.png"); 
    image.resize(width, height); 

    opencv = new OpenCV(this, width, height); 
    opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); 
} 

void draw() { 

    image(image, 0, 0); 

    opencv.loadImage(image); 
    Rectangle[] faces = opencv.detect(); 

    noFill(); 
    stroke(255, 0, 0); 
    strokeWeight(3); 
    for (Rectangle face : faces) { 
    rect(face.x, face.y, face.width, face.height); 
    } 
} 

OpenCV face detection

私はすべてのフレームopencv.detect()機能を呼んでいることに注意してください。あなたはsetup()からしか呼び出していません。つまり、最初のフレームの顔しか検出していません。

まだ動作しない場合は、デバッグを行う必要があります。できるだけ問題を切り分けてください。キネクトコードを取り除き、ハードコードされた画像を使用するだけです。あなたのキネクトで得られた画像のスクリーンキャプチャを行い、ライブストリームの代わりにその画像を使用します。小さなステップで作業すれば、あなたは固まったときにさらに具体的な質問を投稿することができます(一般的な "これは機能しません"という質問に役立つのは難しい)。代わりにZを得ました "タイプの質問)。がんばろう。

+0

お返事ありがとうございました。この問題の解決策を時間通りに見つけることができなかったので、私は、顔認識を組み込んだ公式のXbox Kinect SDKで動作する処理ライブラリ「Windows用Kinect 2」を使ってWindows下での開発に切り替えました。顔認識のためにopenCVを却下した。 – mindcraft

+0

実際にハードコードされた単一のイメージで物事を試してみるのは私がここに尋ねる前の私の最初のアプローチでした。私の問題は、Kinectが継続的に受け取ったデータがopenCVによって処理されなかったことです。少なくとも、コード内でどのように実装されるべきかを期待していました。 しかし、これまでに試したことがないのは、opencv.detect()をsetup()関数の外に呼び出すことです。私はそうする時間を見つけるとすぐにそれを試みます。それでも、私はあなたのフィードバックに感謝します! – mindcraft

関連する問題