OpenCV中Kinect的使用(3)
接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)相关推荐
- OpenCV单kinect多帧静止场景的深度图像去噪
from: OpenCV单kinect多帧静止场景的深度图像去噪 老板kinect去噪的任务下达已经有半个多月了,前期除了看了几天文献之外就打酱油了,好像每天都很忙,可是就是不知道在忙什么.这几天为了 ...
- OpenCV使用Kinect和其他OpenNI兼容的深度传感器
使用Kinect和其他OpenNI兼容的深度传感器 使用Kinect和其他OpenNI兼容的深度传感器 使用Kinect和其他OpenNI兼容的深度传感器 通过VideoCapture类支持与Open ...
- Opencv及Kinect/OpenNI常用学习网址
跟OpenCV相关的 OpenNIKinect相关博客和资源 跟OpenGL有关的 ML常用博客和资料等 国内科研团队和牛人网页 国外科研团队和牛人网页 图像分割资料 Deep Learning 算法 ...
- OpenCV学习笔记(12)——OpenCV中的轮廓
什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...
- OpenCV中的光流及视频特征点追踪
OpenCV中的光流及视频特征点追踪 1. 效果图 2. 原理 2.1 什么是光流?光流追踪的前提.原理 2.2 光流的应用 2.3 光流的2种方法 3. 源码 3.2 稀疏光流追踪 3.2 优化版稀 ...
- Python,OpenCV中的图像修复——cv2.inpaint()
Python,OpenCV中的图像修复--cv2.inpaint 1. 效果图 2. 原理 3. 源码 参考 image inpainting 图像修改 这篇博客将介绍如何通过OpenCV中图像修复的 ...
- 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, ...
- OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征)
OpenCV中的SURF(加速健壮功能) 1. 效果图 2. 原理 2.1 为什么SURF比SIFT快? 2.3 怎样获取SIFT与SURF? 3. 源码 参考 上一篇博客介绍了用于关键点检测和描述的 ...
- Python,OpenCV中的霍夫圆变换——cv2.HoughCircles()
Python,OpenCV中的霍夫圆变换 1. 效果图 2. 源码 参考 这篇博客将学习如何使用霍夫圆变换在图像中找到圆圈,OpenCV使用cv2.HoughCircles()实现霍夫圆变换. cir ...
最新文章
- PHP面试常考内容之Memcache和Redis(2)
- golang struct 切片数组去重
- Host 'XXX' is not allowed to connect to this MySQL server 解决方案/如何开启MySQL的远程帐号...
- AndroidStudio 集成环信的一个坑
- Python 的 requests 库的用法
- 4020-基于链地址法的散列表的插入(C++,附思路以及头插法,尾插法两种代码)
- FTP学习的一些笔记
- linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)
- 如何发现隐藏的Webshell后门
- 【C语言】c语言基础知识梳理(超全)
- 基于MATLAB的答题卡识别系统
- ipv6有必要打开吗_路由器中的IPv6功能需不需要开启?
- 2017年网易校招Java面试题
- Kubernetes 基于Service的蓝绿发布
- 【JavaSE】学了这么久Java,你真的会用代码块吗?
- java 控制随机概率_【功能实现】实现设置概率的随机数
- 荧光量子产率计算机模拟,如何提高荧光染料的量子产率,或许可以从这里找到答案...
- matlab画一个放大图中图
- CPU使用率不高,内存怎么使用率也不高,但系统假死了
- 二元关系的性质与二元关系:等价,相容,偏序
热门文章
- VB/VBA中实现数据库与文件的存取
- Ubuntu下使用cmake结合CmakeLists.txt生成makefile文件并进行编译
- IDEA远程部署调试Java应用程序
- Namomo Spring Camp Div2 Week1 - 第五次打卡
- 【参考】微信 - 数据库 -官方封装接口说明:
- 解析linux中的vfs文件系统机制,解析Linux中的VFS文件系统机制
- java给按钮加声音_怎么在java中给按钮添加声音?
- php速度慢不怕cpu漏洞,PHP曝远程DOS漏洞可致CPU持续占满,请注意升级_护卫神
- arcengine 加载地图不显示_layUi的html页面动态加载的元素不显示
- Myeclipse+SSH+miniui,Action数据加载到miniui表格