接OpenCV中Kinect的使用(2),下面内容主要讲述使用OpenNI 控制Kinect 的马达,实现摄像头的上下摆动。

下面是透过OpenNI比较低阶的USB控制介面(XnUSB.h),来做到马达的控制的代码:(来自这里)

使用时应注意一点:在使用该代码控制马达时,使用前应确保摄像头是关闭的;在每一次准备调整其角度时,都要先关闭摄像头。

原因不明。

  1 // Forked from: https://groups.google.com/d/msg/openni-dev/T_CeVW_d8ig/dsBKONIpNyQJ
  2
  3 #include <XnUSB.h>
  4 #include <cstdio>
  5
  6 #ifdef _WIN32
  7 #include <Windows.h>
  8 void pause_ ()
  9 {
 10     Sleep(1000);
 11 }
 12 #else
 13 #include <unistd.h>
 14 void pause_ ()
 15 {
 16     sleep(1);
 17 }
 18 #endif
 19
 20 /**
 21  * Class to control Kinect's motor.
 22  */
 23 class KinectMotors
 24 {
 25 public:
 26     enum { MaxDevs = 16 };
 27
 28 public:
 29     KinectMotors();
 30     virtual ~KinectMotors();
 31
 32     /**
 33         * Open device.
 34         * @return true if succeeded, false - overwise
 35         */
 36     bool Open();
 37
 38     /**
 39         * Close device.
 40         */
 41     void Close();
 42
 43     /**
 44         * Move motor up or down to specified angle value.
 45         * @param angle angle value
 46         * @return true if succeeded, false - overwise
 47         */
 48     bool Move(int angle);
 49
 50 private:
 51     XN_USB_DEV_HANDLE m_devs[MaxDevs];
 52     XnUInt32 m_num;
 53     bool m_isOpen;
 54 };
 55
 56 KinectMotors::KinectMotors()
 57 {
 58     m_isOpen = false;
 59 }
 60
 61 KinectMotors::~KinectMotors()
 62 {
 63     Close();
 64 }
 65
 66 bool KinectMotors::Open()
 67 {
 68     const XnUSBConnectionString *paths;
 69     XnUInt32 count;
 70     XnStatus res;
 71
 72     // Init OpenNI USB
 73     res = xnUSBInit();
 74     if (res != XN_STATUS_OK)
 75     {
 76         xnPrintError(res, "xnUSBInit failed");
 77         return false;
 78     }
 79
 80     // Open all "Kinect motor" USB devices
 81     res = xnUSBEnumerateDevices(0x045E /* VendorID */, 0x02B0 /*ProductID*/, &paths, &count);
 82     if (res != XN_STATUS_OK)
 83     {
 84         xnPrintError(res, "xnUSBEnumerateDevices failed");
 85         return false;
 86     }
 87
 88     // Open devices
 89     for (XnUInt32 index = 0; index < count; ++index)
 90     {
 91         res = xnUSBOpenDeviceByPath(paths[index], &m_devs[index]);
 92         if (res != XN_STATUS_OK) {
 93             xnPrintError(res, "xnUSBOpenDeviceByPath failed");
 94             return false;
 95         }
 96     }
 97
 98     m_num = count;
 99     XnUChar buf[1]; // output buffer
100
101     // Init motors
102     for (XnUInt32 index = 0; index < m_num; ++index)
103     {
104         res = xnUSBSendControl(m_devs[index], (XnUSBControlType) 0xc0, 0x10, 0x00, 0x00, buf, sizeof(buf), 0);
105         if (res != XN_STATUS_OK) {
106             xnPrintError(res, "xnUSBSendControl failed");
107             Close();
108             return false;
109         }
110
111         res = xnUSBSendControl(m_devs[index], XN_USB_CONTROL_TYPE_VENDOR, 0x06, 0x01, 0x00, NULL, 0, 0);
112         if (res != XN_STATUS_OK) {
113             xnPrintError(res, "xnUSBSendControl failed");
114             Close();
115             return false;
116         }
117     }
118
119     m_isOpen = true;
120
121     return true;
122 }
123
124 void KinectMotors::Close()
125 {
126     if (m_isOpen) {
127         for (XnUInt32 index = 0; index < m_num; ++index) {
128             xnUSBCloseDevice(m_devs[index]);
129         }
130         m_isOpen = false;
131     }
132 }
133
134 bool KinectMotors::Move(int angle)
135 {
136     XnStatus res;
137
138     // Send move control requests
139     for (XnUInt32 index = 0; index < m_num; ++index)
140     {
141         res = xnUSBSendControl(m_devs[index], XN_USB_CONTROL_TYPE_VENDOR, 0x31, angle, 0x00, NULL, 0, 0);
142
143         if (res != XN_STATUS_OK)
144         {
145             xnPrintError(res, "xnUSBSendControl failed");
146             return false;
147         }
148     }
149     return true;
150 }
151
152 int main(int argc, char *argv[])
153 {
154     KinectMotors motors;
155
156     if (!motors.Open()) // Open motor devices
157         return 1;
158
159     motors.Move(31); // Move them up to 31 degree
160
161     pause_();
162
163     motors.Move(-31); // Move them down to 31 degree.
164
165     pause_();
166
167     motors.Move(0);
168     return 0;
169 }

参考资料:

使用OpenNI 控制Kinect 的马达

2013-10-30

转载于:https://www.cnblogs.com/steven-blog/p/3397525.html

OpenCV中Kinect的使用(3)相关推荐

  1. OpenCV单kinect多帧静止场景的深度图像去噪

    from: OpenCV单kinect多帧静止场景的深度图像去噪 老板kinect去噪的任务下达已经有半个多月了,前期除了看了几天文献之外就打酱油了,好像每天都很忙,可是就是不知道在忙什么.这几天为了 ...

  2. OpenCV使用Kinect和其他OpenNI兼容的深度传感器

    使用Kinect和其他OpenNI兼容的深度传感器 使用Kinect和其他OpenNI兼容的深度传感器 使用Kinect和其他OpenNI兼容的深度传感器 通过VideoCapture类支持与Open ...

  3. Opencv及Kinect/OpenNI常用学习网址

    跟OpenCV相关的 OpenNIKinect相关博客和资源 跟OpenGL有关的 ML常用博客和资料等 国内科研团队和牛人网页 国外科研团队和牛人网页 图像分割资料 Deep Learning 算法 ...

  4. OpenCV学习笔记(12)——OpenCV中的轮廓

    什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...

  5. OpenCV中的光流及视频特征点追踪

    OpenCV中的光流及视频特征点追踪 1. 效果图 2. 原理 2.1 什么是光流?光流追踪的前提.原理 2.2 光流的应用 2.3 光流的2种方法 3. 源码 3.2 稀疏光流追踪 3.2 优化版稀 ...

  6. Python,OpenCV中的图像修复——cv2.inpaint()

    Python,OpenCV中的图像修复--cv2.inpaint 1. 效果图 2. 原理 3. 源码 参考 image inpainting 图像修改 这篇博客将介绍如何通过OpenCV中图像修复的 ...

  7. Python,OpenCV中的K均值聚类——K-Means Cluster

    Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...

  8. OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征)

    OpenCV中的SURF(加速健壮功能) 1. 效果图 2. 原理 2.1 为什么SURF比SIFT快? 2.3 怎样获取SIFT与SURF? 3. 源码 参考 上一篇博客介绍了用于关键点检测和描述的 ...

  9. Python,OpenCV中的霍夫圆变换——cv2.HoughCircles()

    Python,OpenCV中的霍夫圆变换 1. 效果图 2. 源码 参考 这篇博客将学习如何使用霍夫圆变换在图像中找到圆圈,OpenCV使用cv2.HoughCircles()实现霍夫圆变换. cir ...

最新文章

  1. PHP面试常考内容之Memcache和Redis(2)
  2. golang struct 切片数组去重
  3. Host 'XXX' is not allowed to connect to this MySQL server 解决方案/如何开启MySQL的远程帐号...
  4. AndroidStudio 集成环信的一个坑
  5. Python 的 requests 库的用法
  6. 4020-基于链地址法的散列表的插入(C++,附思路以及头插法,尾插法两种代码)
  7. FTP学习的一些笔记
  8. linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)
  9. 如何发现隐藏的Webshell后门
  10. 【C语言】c语言基础知识梳理(超全)
  11. 基于MATLAB的答题卡识别系统
  12. ipv6有必要打开吗_路由器中的IPv6功能需不需要开启?
  13. 2017年网易校招Java面试题
  14. Kubernetes 基于Service的蓝绿发布
  15. 【JavaSE】学了这么久Java,你真的会用代码块吗?
  16. java 控制随机概率_【功能实现】实现设置概率的随机数
  17. 荧光量子产率计算机模拟,如何提高荧光染料的量子产率,或许可以从这里找到答案...
  18. matlab画一个放大图中图
  19. CPU使用率不高,内存怎么使用率也不高,但系统假死了
  20. 二元关系的性质与二元关系:等价,相容,偏序

热门文章

  1. VB/VBA中实现数据库与文件的存取
  2. Ubuntu下使用cmake结合CmakeLists.txt生成makefile文件并进行编译
  3. IDEA远程部署调试Java应用程序
  4. Namomo Spring Camp Div2 Week1 - 第五次打卡
  5. 【参考】微信 - 数据库 -官方封装接口说明:
  6. 解析linux中的vfs文件系统机制,解析Linux中的VFS文件系统机制
  7. java给按钮加声音_怎么在java中给按钮添加声音?
  8. php速度慢不怕cpu漏洞,PHP曝远程DOS漏洞可致CPU持续占满,请注意升级_护卫神
  9. arcengine 加载地图不显示_layUi的html页面动态加载的元素不显示
  10. Myeclipse+SSH+miniui,Action数据加载到miniui表格