openFrameworks + kinect + myoで遊ぶ

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

# 環境設定
Myo,kinect,openFrameworksのそれぞれをインストール

## Myo設定
[Myoのページ](https://developer.thalmic.com/)からconnectorを落としてインストールする。
インストール中は、BTドングルとUSBの両方で接続したり外したりと
インストールするだけでも楽しい。

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

## kinect接続
[kinectのページ](https://www.microsoft.com/en-us/download/details.aspx?id=44561)からドライバを落としてインストール。

後はUSBさすだけ。割愛。

## openframeworks設定
[openframeworksのページ](http://openframeworks.cc/)から環境にあったものをダウンロード。

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

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

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

```c++
# 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からパクったから。

``` c++
# 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側実装
恥ずかしさを表現するためのはずいイメージなどを宣言。
デフォルト定義は割愛。

``` cpp
# ofApp.h
public:
		void exit();

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

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

```

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

``` cpp
# 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にアップできたらリンク張る。~~
[はりました](https://github.com/miyatama/hazukashi-detector)

参考
[Kinectで店員を呼ぶ装置：openFrameworksのaddonをいくつか紹介](http://atl.recruit-tech.co.jp/blog/1393/)