Libfreenect 错误的深度图
Libfreenect wrong depth map
我一直在我的项目中使用 OpenNI+PrimeSense+NiTE 和 OpenCV 来根据对象的距离来分割对象。然而,我打算将它部署在 NVIDIA Jetson TX1 板上,但它无法使用 OpenCV 编译 OpenNI+PrimeSense+NiTE。
我最终得到了 libfreenect。然而,libfreenect 提供的深度图非常非常错误。我将分享一些例子。
这是OpenNI的工作深度图:
OpenNI Depth Map
libfreenect 错误的深度图在这里:Libfreenect Depth Map
我的 libfreenect 代码基于 OpenKinect 网站上的默认 C++ 包装器。
有人可以帮我吗?非常感谢。
看起来像是深度数据的不同映射。
您可以尝试将 libfreenect 数据放入 cv::Mat 并对其进行缩放:
const float scaleFactor = 0.05f;
depth.convertTo(depthMat8UC1, CV_8UC1, scaleFactor);
imshow("depth gray",depthMat8UC1);
您还可以在 Jetson TK1 上查看这篇文章和 building OpenNI2。
一旦您设置并运行了 OpenNI,您应该能够从启用 WITH_OPENNI
和 cmake
的源代码编译 OpenCV。之后你应该可以直接在 OpenCV 中获取深度数据:
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
const float scaleFactor = 0.05f;
int main(){
cout << "opening device(s)" << endl;
VideoCapture sensor;
sensor.open(CV_CAP_OPENNI);
if( !sensor.isOpened() ){
cout << "Can not open capture object 1." << endl;
return -1;
}
for(;;){
Mat depth,depthScaled;
if( !sensor.grab() ){
cout << "Sensor1 can not grab images." << endl;
return -1;
}else if( sensor.retrieve( depth, CV_CAP_OPENNI_DEPTH_MAP ) ) {
depth.convertTo(depthScaled, CV_8UC1, scaleFactor);
imshow("depth",depth);
imshow("depth scaled",depthScaled);
}
if( waitKey( 30 ) == 27 ) break;
}
}
好吧,对于那些在 ARM 或 AARCH64 架构(主要是 Jetson TX1)上使用 libfreenect 的人,因为 OpenNI 和 SensorKinect 的构建存在问题,我对 OpenNI 和 SensorKinect 源代码进行了一些调整,以 运行 使用 Aarch64并避免使用 libfreenect。
我一直在我的项目中使用 OpenNI+PrimeSense+NiTE 和 OpenCV 来根据对象的距离来分割对象。然而,我打算将它部署在 NVIDIA Jetson TX1 板上,但它无法使用 OpenCV 编译 OpenNI+PrimeSense+NiTE。 我最终得到了 libfreenect。然而,libfreenect 提供的深度图非常非常错误。我将分享一些例子。
这是OpenNI的工作深度图: OpenNI Depth Map
libfreenect 错误的深度图在这里:Libfreenect Depth Map
我的 libfreenect 代码基于 OpenKinect 网站上的默认 C++ 包装器。
有人可以帮我吗?非常感谢。
看起来像是深度数据的不同映射。
您可以尝试将 libfreenect 数据放入 cv::Mat 并对其进行缩放:
const float scaleFactor = 0.05f;
depth.convertTo(depthMat8UC1, CV_8UC1, scaleFactor);
imshow("depth gray",depthMat8UC1);
您还可以在 Jetson TK1 上查看这篇文章和 building OpenNI2。
一旦您设置并运行了 OpenNI,您应该能够从启用 WITH_OPENNI
和 cmake
的源代码编译 OpenCV。之后你应该可以直接在 OpenCV 中获取深度数据:
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
const float scaleFactor = 0.05f;
int main(){
cout << "opening device(s)" << endl;
VideoCapture sensor;
sensor.open(CV_CAP_OPENNI);
if( !sensor.isOpened() ){
cout << "Can not open capture object 1." << endl;
return -1;
}
for(;;){
Mat depth,depthScaled;
if( !sensor.grab() ){
cout << "Sensor1 can not grab images." << endl;
return -1;
}else if( sensor.retrieve( depth, CV_CAP_OPENNI_DEPTH_MAP ) ) {
depth.convertTo(depthScaled, CV_8UC1, scaleFactor);
imshow("depth",depth);
imshow("depth scaled",depthScaled);
}
if( waitKey( 30 ) == 27 ) break;
}
}
好吧,对于那些在 ARM 或 AARCH64 架构(主要是 Jetson TX1)上使用 libfreenect 的人,因为 OpenNI 和 SensorKinect 的构建存在问题,我对 OpenNI 和 SensorKinect 源代码进行了一些调整,以 运行 使用 Aarch64并避免使用 libfreenect。