やること
顔を検出して拳を握ると恥ずかしい感じにエフェクトをかけるする。
環境設定
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にアップできたらリンク張る。
はりました