c++ - 如何在 openni 和 opencv 中使用 Kinect

标签 c++ opencv kinect rgb openni

一开始,我只需要捕获 RGBstream 并将其转换为一系列 opencv 图像。应该不难,但是我在网上找到了不止一个代码,但是它们不能在我的电脑上运行。不知道哪里错了。

你能给我推荐一个非常简单的代码教程,让我了解如何使用 Kinect 库吗? 一开始我尝试了 Kinect sdk,过了一会儿选择了 OPENNI

帮帮我,谢谢!

ps: 我正在使用 c++VISUAL STUDIO 2010

最佳答案

AFAIK 开箱即用 OpenCV 支持 OpenNI 1.5.x。 如果您还没有安装 OpenNI,请先按照以下特定顺序(这很重要)安装:

  1. 安装 OpenNI 1.5.7
  2. 安装 NITE(兼容 1.5.7)
  3. 如果您使用的是 Kinect(而不是 Asus)传感器,还要安装 Avin's SensorKinect driver

此时您应该已经安装了 OpenNI,所以请继续运行其中一个示例。

默认情况下,预构建的 opencv 库未使用 OpenCV 支持进行编译,因此您需要从源代码构建 opencv 以启用 OpenNI 支持。

安装 CMakeGUI如果你还没有这样做的话。这将允许您轻松配置 opencv 构建过程。运行它,浏览到 opencv 源文件夹,选择一个目标目录来放置你的构建文件并点击配置。

您应该有一个很大的选项列表。如果你滚动,你应该看到检测到 OpenNI 安装文件夹(如果没有,你应该修复路径),你也应该和 WITH_OPENNI 标记你可以启用。

当你完成后按生成,它应该生成你需要的 visual studio 项目文件来轻松编译 opencv 库。

有关在 Windows 上从源代码构建 opencv 的更多详细信息,请查看 official documentation

当你完成编译后,你应该已经构建了支持 openni 的 opencv,你应该能够运行一些简单的东西:

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>

using namespace cv;
using namespace std;

int main(){
    cout << "opening device(s)" << endl;

    VideoCapture sensor1;
    sensor1.open(CV_CAP_OPENNI);

    if( !sensor1.isOpened() ){
        cout << "Can not open capture object 1." << endl;
        return -1;
    }

    for(;;){
        Mat depth1;

        if( !sensor1.grab() ){
            cout << "Sensor1 can not grab images." << endl;
            return -1;
        }else if( sensor1.retrieve( depth1, CV_CAP_OPENNI_DEPTH_MAP ) ) imshow("depth1",depth1);

        if( waitKey( 30 ) == 27 )   break;//ESC to exit

   }
}

另见 this similar answer . 如果您需要使用 OpenNI 2.x,请参阅以下资源:

关于c++ - 如何在 openni 和 opencv 中使用 Kinect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22531480/

相关文章:

c# - Kinect 关节 - 对象引用未设置为对象的实例

c# - Microsoft 语音识别 - 我必须添加什么引用?

c++ - gcov:从共享库生成 .gcda 输出?

c++ - 从 OpenCV (C++) 中的目录读取多个图像

kinect - 深度数据和点云有什么区别?

c++ - 是否可以使用手动输入制作 OpenCV 矩阵?

Opencv:如何使图像适合非矩形轮廓?

c++ - 分段后如何创建掩码来选择分段类?

c++ - 检查一个类是否有一个有参数的函数

c++ - 地址不能取什么样的左值?