很多时候单单有一组数据出来不是很直观,所以查了一些资料写了把两个红外摄像头采集到的图片显示到一张图上的小demo
关键代码:
ImageList images= frame.images();
需要配置的环境:
1. LeapMotion环境
2. Opencv环境
环境配置参见上一篇博客:
http://blog.csdn.net/zmdsjtu/article/details/52537919
或者:
Opencv环境配置:http://blog.csdn.net/zmdsjtu/article/details/52235056
LeapMotion配置:http://blog.csdn.net/zmdsjtu/article/details/52514270
此外需打开右下角LeapMotion控制面板,将允许图像勾选上
代码如下:
#include "Leap.h"
#include "opencv2/opencv.hpp"
using namespace Leap;
using namespace cv;
class SampleListener : public Listener {
public:
virtual void onInit(const Controller&);
virtual void onConnect(const Controller&);
virtual void onDisconnect(const Controller&);
virtual void onExit(const Controller&);
virtual void onFrame(const Controller&);
private:
};
void SampleListener::onInit(const Controller& controller) {
std::cout << "劳资已经准备好了~" << std::endl;
}
void SampleListener::onConnect(const Controller& controller) {
std::cout << "差不多已经看清你的爪子了" << std::endl;
}
void SampleListener::onDisconnect(const Controller& controller) {
std::cout << "看不到你了,你是不是把什么拔了" << std::endl;
}
void SampleListener::onExit(const Controller& controller) {
std::cout << "走就走!!!" << std::endl;
}
void SampleListener::onFrame(const Controller& controller) {
const Frame frame = controller.frame();
ImageList images = frame.images();
Mat A;//左侧红外摄像头
Mat B;//右侧
if (images.count() >= 2)
{
A = Mat(images[0].height(), images[0].width(), CV_8UC1, (void *)images[0].data());
B = Mat(images[1].height(), images[1].width(), CV_8UC1, (void *)images[1].data());
//下面是把两张图合并到一张
int totalRows = A.rows + B.rows;
cv::Mat mergedDescriptors(totalRows, A.cols, A.type());
cv::Mat submat = mergedDescriptors.rowRange(0, A.rows);//中间过度的,用以把数据传过去~
A.copyTo(submat);
submat = mergedDescriptors.rowRange(A.rows, totalRows);
B.copyTo(submat);
imshow("左右摄像头对比图", mergedDescriptors);//合并到mergedDescriptors
waitKey(1);
}
}
int main(int argc, char** argv) {
SampleListener listener;
Controller controller;
controller.addListener(listener);
controller.setPolicy(Leap::Controller::POLICY_BACKGROUND_FRAMES);
controller.setPolicy(Leap::Controller::POLICY_IMAGES);
std::cout << "输入Enter退出" << std::endl;
std::cin.get();
controller.removeListener(listener);
return 0;
}
可以看出和普通的摄像头还是有一些区别的,靠得近会显得手指很瘦长,哈哈哈
直观上左右两个输出的图像很近,2333
最后祝大家编程愉快: )