kinect 无法在我的Android开发板上显示的分析


之前在网上发现黑客已经将kinect移植到Android上,使用的beagleboard平台。公司想在kinect上深耕一下,所以需要将kinect在公司的android开发板上实现。记录以备忘。

一,按照黑客的教程,将之移植到beagleboard C4平台上。挺顺利。但深度图像只能维持几秒钟,因beagleboard不是我的最终目的,此问题搁置,beagleboard作为参考。黑客的教程点击这里。

顺便说一下,配置开发工具很麻烦,尤其是有些需要翻墙出去下,所以建议下载上面网页结尾处作者提供的完整软件包。解压后修改一下环境变量即可用。可以更懒一下:新建一个跟作者相同的用户名,将包解压到相应的文件夹,整个工程及其软件就可以用了。

二、将之移植到自己的android开发板。硬件平台就不具体说了,不是国际大厂的。

出错:加速度计显示正常,但深度图像没有显示,全黑。

到此为止,我一直没有仔细看代码。呵呵。没办法了,看代码吧。

框架:openframework

流程:openframework->ofxAndroid->ofxKinect->freenect->libusb之后就是linux内核?

前面不说了,可以借助打印log进行分析。没有显示的原因是ofxKinect::threadedFunction()函数中,

  1. void ofxKinect::threadedFunction(){   
  2.                    
  3.         freenect_set_led(kinectDevice, LED_GREEN);   
  4.         freenect_set_depth_format(kinectDevice, FREENECT_DEPTH_11BIT);   
  5.         freenect_set_depth_callback(kinectDevice, &grabDepthFrame);   
  6.            
  7.         ofLog(OF_LOG_VERBOSE, "leon ofxKinect: Connection opened");   
  8.            
  9.         freenect_start_depth(kinectDevice);   
  10.         ...............   
  11. }  


最后一条语句设置回调函数,具体实现如下  
  1. void freenect_set_depth_callback(freenect_device *dev, freenect_depth_cb cb)   
  2. {          
  3.         dev->depth_cb = cb;   
  4. }  
将回调函数赋值给dev->depth-cb, 之后调用freenect_start_depth(kinectDevice);  
  1. int freenect_start_depth(freenect_device *dev)   
  2. {   
  3.         freenect_context *ctx = dev->parent;   
  4.         int res;   
  5.            
  6.         ..........................   
  7.         dev->depth.pkt_size = DEPTH_PKTDSIZE;   
  8.         dev->depth.synced = 0;   
  9.         dev->depth.flag = 0x70;   
  10.         dev->depth.valid_frames = 0;   
  11.         res = fnusb_start_iso(&dev->usb_cam, &dev->depth_isoc, depth_process, 0x82, NUM_XFERS, PKTS_PER_XFER, DEPTH_PKTBUF);   
  12.         ................   
  13. }  
函数fnusb_start_iso()将参数depth_process设为回调函数,
  1. fnusb_start_iso(){   
  2.                 strm->cb = cb;   
  3.                 libusb_fill_iso_transfer(strm->xfers[i], dev->dev, ep, bufp, pkts * len, pkts, iso_callback, strm, 0);   
  4. }  
  //在此函数中将iso_callback函数设为回调函数  
  1. static inline void libusb_fill_iso_transfer(struct libusb_transfer *transfer,   
  2.         libusb_device_handle *dev_handle, unsigned char endpoint,   
  3.         unsigned char *buffer, int length, int num_iso_packets,   
  4.         libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout)   
  5. {   
  6.         transfer->dev_handle = dev_handle;   
  7.         transfer->endpoint = endpoint;   
  8.         transfer->type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS;    
  9.         transfer->timeout = timeout;   
  10.         transfer->buffer = buffer;   
  11.         transfer->length = length;    
  12.         transfer->num_iso_packets = num_iso_packets;   
  13.         transfer->user_data = user_data;   
  14.         transfer->callback = callback;   
  15. }  
  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容