Firefly开源社区

Firefly-RK3399 上使用 Kinect :OpenCV 3 + OpenNI2 + libfreenect

115

积分

3

威望

0

贡献

技术小白

积分
115
发表于 2017-5-20 15:12:29     
本帖最后由 eevee 于 2017-5-21 08:15 编辑

OS:官方固件 Xubuntu 16.04

1) 准备 Preparation

1.1) Install libfreenect

Note:
  libfreenect  for Kinect Xbox 360
  libfreenect2 for Kinect Xbox One
  1. # download latest code, instead of latest release v0.5.5
  2. $ git clone https://github.com/OpenKinect/libfreenect.git
  3. $ cd libfreenect/

  4. # fix issue with OpenCV, in line 173
  5. $ vi OpenNI2-FreenectDriver/src/DepthStream.hpp

  6.         case XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE:    // unsigned long long or unsigned int (for OpenNI2/OpenCV)
  7.           if (*pDataSize != sizeof(unsigned long long) && *pDataSize != sizeof(unsigned int))
  8.           {
  9.             LogError("Unexpected size for XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE");
  10.             return ONI_STATUS_ERROR;
  11.           } else {
  12.             if (*pDataSize != sizeof(unsigned long long)) {
  13.               *(static_cast<unsigned long long*>(data)) = ZERO_PLANE_DISTANCE_VAL;
  14.             } else {
  15.               *(static_cast<unsigned int*>(data)) = (unsigned int) ZERO_PLANE_DISTANCE_VAL;
  16.             }
  17.           }
  18.           return ONI_STATUS_OK;

  19. # build
  20. $ mkdir build
  21. $ cd build
  22. $ cmake -DBUILD_OPENNI2_DRIVER=ON ..
  23. $ make

  24. # preview
  25. $ ./bin/freenect-glview
复制代码

freenect-glview.png

1.2) Install OpenNI

  1. # download this, aarch64 platform support
  2. $ git clone -b develop https://github.com/joinAero/OpenNI2.git
  3. $ cd OpenNI2/

  4. # deps
  5. $ sudo apt-get install libudev-dev
  6. # or, all
  7. $ sudo apt-get install \
  8.     g++              \
  9.     python           \
  10.     libusb-1.0-0-dev \
  11.     libudev-dev      \
  12.     openjdk-6-jdk    \
  13.     freeglut3-dev    \
  14.     doxygen          \
  15.     graphviz

  16. # build
  17. $ make

  18. # setup
  19. $ echo "export OPENNI2_INCLUDE=`pwd`/Include" >> ~/.bashrc
  20. $ echo "export OPENNI2_REDIST=`pwd`/Bin/AArch64-Release" >> ~/.bashrc
复制代码

Then, copy the freenect driver to OpenNI2 driver repository:

  1. $ cd libfreenect/build/
  2. $ cd lib/OpenNI2-FreenectDriver/

  3. $ export FREENECT_DRIVER_LIB=libFreenectDriver.so
  4. $ export FREENECT_DRIVER_REAL_LIB=$(python - <<'EOF'
  5. import os
  6. lib = os.environ['FREENECT_DRIVER_LIB']
  7. while os.path.islink(lib):
  8.     lib = os.readlink(lib)
  9. print(lib)
  10. EOF
  11. )
  12. $ ln -sf `pwd`/$FREENECT_DRIVER_REAL_LIB $OPENNI2_REDIST/OpenNI2/Drivers/$FREENECT_DRIVER_LIB
复制代码

1.3) Build OpenCV with OpenNI

  1. $ cd opencv/
  2. $ mkdir build
  3. $ cd build/

  4. $ export PY_NAME=$(python -c 'from sys import version_info as v; print("python%d.%d" % v[:2])')
  5. $ export PY_NUMPY_DIR=$(python -c 'import os.path, numpy.core; print(os.path.dirname(numpy.core.__file__))')

  6. $ cmake -DCMAKE_BUILD_TYPE=RELEASE \
  7. -DCMAKE_INSTALL_PREFIX=/usr/local \
  8. \
  9. -DPYTHON2_EXECUTABLE=$(which python) \
  10. -DPYTHON_INCLUDE_DIR=/usr/include/$PY_NAME \
  11. -DPYTHON_INCLUDE_DIR2=/usr/include/aarch64-linux-gnu/$PY_NAME \
  12. -DPYTHON_LIBRARY=/usr/lib/aarch64-linux-gnu/lib$PY_NAME.so \
  13. -DPYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/$PY_NAME/dist-packages/numpy/core/include/ \
  14. \
  15. -DWITH_OPENNI2=ON \
  16. \
  17. -DBUILD_DOCS=OFF \
  18. -DBUILD_EXAMPLES=OFF \
  19. -DBUILD_TESTS=OFF \
  20. -DBUILD_PERF_TESTS=OFF \
  21. \
  22. -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
  23. ..

  24. $ make -j$(nproc --all)
  25. $ sudo make install
复制代码

2) 使用 Usage

`kinect.cc`:

  1. #include "camera.hpp"

  2. int main(int argc, char const *argv[]) {
  3.     Camera cam(cv::CAP_OPENNI2);
  4.     if (!cam.IsOpened()) {
  5.         std::cerr << "ERROR: Open camera failed" << std::endl;
  6.         return 1;
  7.     }
  8.     std::cout << "\033[1;32mPress ESC/Q to terminate\033[0m\n\n";

  9.     double min, max;
  10.     cv::Mat adjmap, colormap;
  11.     cam.Capture([&](const cv::Mat& frame, const cv::Mat& depthmap) {
  12.         cv::minMaxIdx(depthmap, &min, &max);
  13.         const float scale = 255 / (max-min);
  14.         depthmap.convertTo(adjmap, CV_8UC1, scale, -min*scale);

  15.         //applyColorMap(adjmap, colormap, cv::COLORMAP_AUTUMN);

  16.         cam.DrawInfo(frame);
  17.         cam.DrawInfo(adjmap);
  18.         cv::imshow("frame", frame);
  19.         cv::imshow("depthmap", adjmap);

  20.         const int key = cv::waitKey(10);
  21.         return !(key == 27 || key == 'q' || key == 'Q'); // ESC/Q
  22.     });

  23.     return 0;
  24. }
复制代码

kinect-sample.png

完整的 C++ 代码见这,Python 代码见这

3) 结束 Finally

步骤 1.1:

* 直接安装 libfreenect 使用时,没有 OpenNI2 驱动,需要自己编译。
* 自己编译 libfreenect 时,请使用最新代码。当前 Release v0.5.5 未支持好 aarch64 。
* 自己编译 libfreenect 时,如果要结合 OpenCV 使用,得做个修正。

步骤 1.2:

* 直接安装 OpenNI2 使用时,运行时没能找到 Kinect ,也可能我没插好。
* 使用官方 OpenNI2 ARM 版本时,报不兼容的错误,与 aarch64 是有冲突的。
* 自己编译 OpenNI2 时, aarch64 平台未支持好, fork 了个版本。

Python 代码:

* 同时获取图像和深度时,图像是有问题的,见此 Issue


参考:Use Kinect on Firefly-RK3399
回复

使用道具 举报

891

积分

76

威望

51

贡献

超级版主

Rank: 8Rank: 8

积分
891
发表于 2017-5-22 08:57:32     
做得很好,感谢分享
回复

使用道具 举报

19

积分

0

威望

0

贡献

游客

积分
19
发表于 2017-6-3 00:37:00     
回复

使用道具 举报

28

积分

0

威望

0

贡献

游客

积分
28
发表于 2017-11-10 21:47:18     
最后的CPP和Python代码都是错的,坑了老子一天。
回复

使用道具 举报

41

积分

0

威望

0

贡献

技术小白

积分
41
发表于 2018-6-29 11:01:06     
LZ,opencv怎么能够在python3中支持呢?安装的都是在python2中使用
回复

使用道具 举报

7

积分

0

威望

0

贡献

技术小白

积分
7
发表于 2019-6-17 13:35:26     
等会儿去试试
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表