LoginSignup
2
1

More than 3 years have passed since last update.

openFrameworks + kinect + myoで遊ぶ

Last updated at Posted at 2016-08-28

やること

顔を検出して拳を握ると恥ずかしい感じにエフェクトをかけるする。

環境設定

Myo,kinect,openFrameworksのそれぞれをインストール

Myo設定

Myoのページからconnectorを落としてインストールする。
インストール中は、BTドングルとUSBの両方で接続したり外したりと
インストールするだけでも楽しい。

キャリブレーションまで済ませて終わり。

kinect接続

kinectのページからドライバを落としてインストール。

後はUSBさすだけ。割愛。

openframeworks設定

openframeworksのページから環境にあったものをダウンロード。

exampleとかいろいろ触ってみて終わり。

実装

kinect,openCVをaddonに指定してgenerate。

MYOを扱う

拳の握りはMYOから取得する。MYOのセンサをとるために、MyoDeviceクラスを作成。

# MyoDevice.h
    void onEmgData(myo::Myo* myo, uint64_t timestamp, const int8_t* emg);
    void print();

    bool enjoy;
    int8_t emgs[8];

実装は超簡単。emgsを取って、30以上のブレ幅ならenjoy扱い。
enjoyの関数名がprintなのは、sampleからパクったから。

# MyoDevice.cpp
    void MyoDevice::onEmgData(myo::Myo* myo, uint64_t timestamp, const int8_t* emg)
    {
        for (int i = 0; i < 8; i++) {
            emgs[i] = emg[i];
        }
    }

    void MyoDevice::print()
    {
        for (int i = 0; i < 8; i++) {
            if (abs(emgs[i]) >= 30) {
                enjoy = !enjoy;
                if (enjoy) {
                    std::cout << "Myo enjoy!!!." << std::endl;
                }
                else {
                    std::cout << "Myo not enjoy...." << std::endl;

                }
                return;
            }
        }
    }

openCV側実装

恥ずかしさを表現するためのはずいイメージなどを宣言。
デフォルト定義は割愛。

# ofApp.h
public:
        void exit();

private:
    ofImage hazuiImage;
    ofImage grayImage;
    ofImage colorImage;
    ofxCvHaarFinder haarFinder;

    myo::Hub hub;
    MyoDevice myoDevice;
    ofxKinect kinect;

顔の検出を行ってそれっぽい位置にはずいロジック(画像描画)書くだけ。

# ofApp.cpp

#include "ofxOpenCv.h"
#include "myo/myo.hpp"
using namespace cv;

void ofApp::setup(){
    kinect.init();
    kinect.open();

    kinect.setRegistration(true);
    ofSetFrameRate(60);




    myoDevice.enjoy = false;

    myo::Myo* myo = hub.waitForMyo(10000);

    myo->setStreamEmg(myo::Myo::streamEmgEnabled);

    hub.addListener(&myoDevice);

    hazuiImage.load("hazui.png");
    haarFinder.setup("haarcascade_frontalface_default.xml");
}

void ofApp::update(){
    kinect.update();

    int width = kinect.width;
    int height = kinect.height;

    ofPixels pixels = kinect.getPixels();
    colorImage.allocate(width, height, OF_IMAGE_COLOR);
    colorImage.setFromPixels(pixels,width,height,OF_IMAGE_COLOR,true);

    cv::Mat mat = cv::Mat(height, width, CV_8UC3, colorImage.getPixels());
    cvtColor(mat, mat, CV_RGB2GRAY);
    grayImage.allocate(width, height, OF_IMAGE_GRAYSCALE);
    grayImage.setFromPixels(mat.ptr(), mat.cols,mat.rows, OF_IMAGE_GRAYSCALE);

    haarFinder.findHaarObjects(grayImage);

    hub.run(100);
    myoDevice.print();
}

void ofApp::draw(){
    int width = kinect.width;
    int height = kinect.height;

    //kinect.draw(0, 0, width,height);

    colorImage.draw(0, 0, width, height);
    //grayImage.draw(0, 0, width, height);

    if (myoDevice.enjoy) {
        ofNoFill();
        for (unsigned int i = 0; i < haarFinder.blobs.size(); i++) {
            ofRectangle cur = haarFinder.blobs[i].boundingRect;
            float hazuiHeight = (cur.height / 5.0);
            float hazuiWidth = (cur.width * 0.8);
            float hazuiX = cur.x + (cur.width * 0.1);
            float hazuiY = cur.y + (cur.height * 0.4);
            hazuiImage.draw(hazuiX, hazuiY, hazuiWidth, hazuiHeight);
        }
    }

}

void ofApp::exit() {
    kinect.close();
}

無事にgithubにアップできたらリンク張る。
はりました

参考
Kinectで店員を呼ぶ装置:openFrameworksのaddonをいくつか紹介

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1