如何在 OpenCV 中使用 Orbbec Astra 深度传感器?
How to use Orbbec Astra depth sensor with OpenCV?
我目前正在使用 Orbbec Astra Mini depth sensor. I downloaded and installed the Astra Driver and OpenNI2 包。一旦我将深度传感器连接到 USB 端口,深度传感器就会显示在我的 Windows 10 上的设备管理器中。目前为止一切正常。
我的目标是用 OpenCV 阅读 RGB images
和 depth map
并用 imshow
显示它们。
以下代码在 Visual Studio 2015 中可以正常编译,但出现此错误:
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file C:\build\master_winpack-build-win64-vc14\opencv\modules\highgui\src\window.cpp
...所以我猜 OpenCV 无法打开设备,因此我的 cv::Mat 一直是空的。
我在某处读到我需要使用 OpenNI 标志编译 OpenCV - 是真的吗?如果是这样,是否有任何有用的链接可以帮助我取得一些进展?有什么我可能错过的想法吗?
#include<iostream>
#include<algorithm>
#include<fstream>
#include<System.h>
#include<time.h>
#include<opencv2/core/core.hpp>
using namespace std;
int main(int argc, char **argv) {
cv::VideoCapture cap;
cap.open(CV_CAP_OPENNI);
cap.set(CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ);
cap.set(CV_CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION, 1);
cv::Mat im, dm; // rgb image, depth map
while (true)
{
if (cap.grab()) {
cap.retrieve(im, CV_CAP_OPENNI_BGR_IMAGE);
cap.retrieve(dm, CV_CAP_OPENNI_DEPTH_MAP);
} else {
cout << "ERROR: Could not grab image data." << endl;
}
if (!im.data) {
cout << "ERROR: RGB not retrieved." << endl;
}
if (!dm.data) {
cout << "ERROR: Depth map not retrieved." << endl;
}
cv::imshow("Image", im);
cv::imshow("Depth", dm);
if (cv::waitKey(1) >= 0)
break;
}
cap.release();
return 0;
}
更新 19.02.18:
问题已通过使用 OpenNI 标志编译 OpenCV 库解决,如 here 所述。谢谢德米特里!
不过,深度图还是比较弱。有什么想法 where/how 来调整参数吗?虽然,当 运行 Orbbec Astra SDK 的示例应用程序时,深度图像非常可靠(使用 OpenGL)。所以我猜问题出在 OpenCV 的某个地方?
深度图截图如下(反白,共振很弱):
我写了一个comprehensive guide how to to compile ORB SLAM 2 (which was my preliminary goal) with OpenCV including OpenNI2 in order to use my Orbbec Astra camera作为深度传感器。希望绊倒这个线程的其他人可以使用它。
您问的是:
However, the depth image is still quite weak. Any ideas where/how to adjust the parameters? Although, when running the sample applications of the Orbbec Astra SDK, the depth image is quite solid (which are working with OpenGL). So I guess the problem is somewhere within OpenCV?
尝试对深度图像实施伪色图。不同的深度像素值相差很大,直接看不容易分辨。
// Holds the colormap version of the image:
Mat img_color;
// Apply the colormap:
applyColorMap(img_in, img_color, COLORMAP_JET);
// Show the result:
imshow("colorMap", img_color);
https://docs.opencv.org/3.4.1/d3/d50/group__imgproc__colormap.html
我目前正在使用 Orbbec Astra Mini depth sensor. I downloaded and installed the Astra Driver and OpenNI2 包。一旦我将深度传感器连接到 USB 端口,深度传感器就会显示在我的 Windows 10 上的设备管理器中。目前为止一切正常。
我的目标是用 OpenCV 阅读 RGB images
和 depth map
并用 imshow
显示它们。
以下代码在 Visual Studio 2015 中可以正常编译,但出现此错误:
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file C:\build\master_winpack-build-win64-vc14\opencv\modules\highgui\src\window.cpp
...所以我猜 OpenCV 无法打开设备,因此我的 cv::Mat 一直是空的。
我在某处读到我需要使用 OpenNI 标志编译 OpenCV - 是真的吗?如果是这样,是否有任何有用的链接可以帮助我取得一些进展?有什么我可能错过的想法吗?
#include<iostream>
#include<algorithm>
#include<fstream>
#include<System.h>
#include<time.h>
#include<opencv2/core/core.hpp>
using namespace std;
int main(int argc, char **argv) {
cv::VideoCapture cap;
cap.open(CV_CAP_OPENNI);
cap.set(CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ);
cap.set(CV_CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION, 1);
cv::Mat im, dm; // rgb image, depth map
while (true)
{
if (cap.grab()) {
cap.retrieve(im, CV_CAP_OPENNI_BGR_IMAGE);
cap.retrieve(dm, CV_CAP_OPENNI_DEPTH_MAP);
} else {
cout << "ERROR: Could not grab image data." << endl;
}
if (!im.data) {
cout << "ERROR: RGB not retrieved." << endl;
}
if (!dm.data) {
cout << "ERROR: Depth map not retrieved." << endl;
}
cv::imshow("Image", im);
cv::imshow("Depth", dm);
if (cv::waitKey(1) >= 0)
break;
}
cap.release();
return 0;
}
更新 19.02.18:
问题已通过使用 OpenNI 标志编译 OpenCV 库解决,如 here 所述。谢谢德米特里!
不过,深度图还是比较弱。有什么想法 where/how 来调整参数吗?虽然,当 运行 Orbbec Astra SDK 的示例应用程序时,深度图像非常可靠(使用 OpenGL)。所以我猜问题出在 OpenCV 的某个地方?
深度图截图如下(反白,共振很弱):
我写了一个comprehensive guide how to to compile ORB SLAM 2 (which was my preliminary goal) with OpenCV including OpenNI2 in order to use my Orbbec Astra camera作为深度传感器。希望绊倒这个线程的其他人可以使用它。
您问的是:
However, the depth image is still quite weak. Any ideas where/how to adjust the parameters? Although, when running the sample applications of the Orbbec Astra SDK, the depth image is quite solid (which are working with OpenGL). So I guess the problem is somewhere within OpenCV?
尝试对深度图像实施伪色图。不同的深度像素值相差很大,直接看不容易分辨。
// Holds the colormap version of the image:
Mat img_color;
// Apply the colormap:
applyColorMap(img_in, img_color, COLORMAP_JET);
// Show the result:
imshow("colorMap", img_color);
https://docs.opencv.org/3.4.1/d3/d50/group__imgproc__colormap.html