Leap Motion 赤外線画像表示
Leap Motionではversion 2より赤外線画像を取得出来るようになりました。ただし、kinectのようなdepth mapは取得できない。これは、Leap Motionが100FPSと高速で動くため、すごく軽い処理で手形状を認識しているためである。
今回は、Leap Motionから得られた赤外線画像をopencvで表示します。
// 160110_Leap.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 //
#include "stdafx.h"
#include <Leap.h>
class SampleListener : public Leap::Listener { public: void onInit(const Leap::Controller& controller) { std::cout << __FUNCTION__ << std::endl; }
void onConnect(const Leap::Controller& controller) { std::cout << __FUNCTION__ << std::endl; }
void onDisconnect(const Leap::Controller& controller) { std::cout << __FUNCTION__ << std::endl; }
void onExit(const Leap::Controller& controller) { std::cout << __FUNCTION__ << std::endl; }
void onFrame(const Leap::Controller& controller) { Leap::Frame frame = controller.frame(); Leap::HandList hands = frame.hands(); Leap::FingerList fingers = frame.fingers(); Leap::PointableList pointables = frame.pointables();
std::cout << "Frame Data : " << "Hands : " << hands.count() << "Fingers : " << fingers.count() << "Extened Fingers : " << fingers.extended().count() << "Pointers : " << pointables.count() << std::endl; }
void onImages(const Leap::Controller& controller) { std::cout << __FUNCTION__ << std::endl;
Leap::Frame frame = controller.frame(); Leap::ImageList images = frame.images();
for (int i = 0; i < 2; i++) { std::ostringstream oss; Leap::Image image = images[i];
// Get the Raw Images cv::Mat result; result.create(image.height(), image.width(), CV_8UC1); // allocate if necessary result.data = (uchar*)image.data();
oss << "Raw Image" << i;
cv::namedWindow(oss.str(), cv::WINDOW_AUTOSIZE); imshow(oss.str(), result); cv::waitKey(1); } }
void onFocusGained(const Leap::Controller& controller) { std::cout << __FUNCTION__ << std::endl; }
void onFocusLost(const Leap::Controller& controller) { std::cout << __FUNCTION__ << std::endl; }
void onServiceConnect(const Leap::Controller& controller) { std::cout << __FUNCTION__ << std::endl; }
void onServiceDisconnect(const Leap::Controller& controller) { std::cout << __FUNCTION__ << std::endl; }
};
int main() { SampleListener listener; Leap::Controller leap; leap.addListener(listener);
// 画像の取得を有効にする leap.setPolicy(Leap::Controller::PolicyFlag::POLICY_IMAGES); std::cin.get(); //cv::waitKey(0);
// 画像消去 cv::destroyAllWindows(); // リスナー消去 leap.removeListener(listener);
return 0; }
参考資料
http://www.buildinsider.net/small/opencv/06#debug
http://stackoverflow.com/questions/29412931/how-to-get-images-from-the-leap-motion-with-opencv
https://community.leapmotion.com/t/get-the-undistorted-images-from-leap/2867
コメント