zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    20170226-云计算设计模式翻译-自动伸缩指南(逐字翻译)
    20170723-Ioc与AOP
    20170710-几维晨规
    诸城项目-开发日志
    GPS常识-B版(简)
    GPS常识-A版(详)
    20141209-基本概念-BlogEngine.NET(1)-笔记
    9.聚类分析
    7.分类:基本概念 忌讳
    6.挖掘关联规则
  • 原文地址:https://www.cnblogs.com/steven-blog/p/3397525.html
Copyright © 2011-2022 走看看