【发布时间】:2014-11-05 11:13:07
【问题描述】:
目前我正在为 Kinect for Windows v2 开发一种工具(类似于 XBOX ONE 中的工具)。我尝试遵循一些示例,并有一个显示相机图像、深度图像和使用 opencv 将深度映射到 rgb 的图像的工作示例。但是我看到它在做映射时重复了我的手,我认为这是由于坐标映射器部分有问题。
这是一个例子:
这是创建图像的代码sn-p(示例中为rgbd图像)
void KinectViewer::create_rgbd(cv::Mat& depth_im, cv::Mat& rgb_im, cv::Mat& rgbd_im){
HRESULT hr = m_pCoordinateMapper->MapDepthFrameToColorSpace(cDepthWidth * cDepthHeight, (UINT16*)depth_im.data, cDepthWidth * cDepthHeight, m_pColorCoordinates);
rgbd_im = cv::Mat::zeros(depth_im.rows, depth_im.cols, CV_8UC3);
double minVal, maxVal;
cv::minMaxLoc(depth_im, &minVal, &maxVal);
for (int i=0; i < cDepthHeight; i++){
for (int j=0; j < cDepthWidth; j++){
if (depth_im.at<UINT16>(i, j) > 0 && depth_im.at<UINT16>(i, j) < maxVal * (max_z / 100) && depth_im.at<UINT16>(i, j) > maxVal * min_z /100){
double a = i * cDepthWidth + j;
ColorSpacePoint colorPoint = m_pColorCoordinates[i*cDepthWidth+j];
int colorX = (int)(floor(colorPoint.X + 0.5));
int colorY = (int)(floor(colorPoint.Y + 0.5));
if ((colorX >= 0) && (colorX < cColorWidth) && (colorY >= 0) && (colorY < cColorHeight))
{
rgbd_im.at<cv::Vec3b>(i, j) = rgb_im.at<cv::Vec3b>(colorY, colorX);
}
}
}
}
}
有人知道如何解决这个问题吗?如何防止这种重复?
提前致谢
更新:
如果我做一个简单的深度图像阈值,我会得到以下图像:
这或多或少是我预料到的,而且背景中没有重复的手。有没有办法防止在后台出现这种重复的手?
【问题讨论】:
-
这个映射是从哪里来的?很可能您必须编辑深度图像和彩色图像之间的校准,因为预定义并不完美。因此,您必须执行自己的校准。看看:nicolas.burrus.name/index.php/Research/KinectCalibration
-
来自kinect SDK v2。我期待使用来自固件/SDK的那个,它使用相机的内部结构来做这个计算……但我认为与其他相机固件/软件相比,错误是巨大的,比如带有openni的Primesense。我希望得到更好的结果,或者至少与其他相机相似....感谢您的链接:)
-
Afaik 固件中保存的 kinect 的自动校准数据并没有那么大。但也许我错了。
-
您好,我也在使用 Kinect for Windows V2。您是否能够执行 kinect 的立体校准?我正在使用 MATLAB 来做到这一点,但由于相机分辨率不相等,我有点不知道该怎么做。
-
@user2441667 我不知道它在 MATLAB 中会怎样,但在 c++ 中,SDK 的执行方式是我在帖子中使用的代码 sn-p ... 与
m_pCoordinateMapper->MapDepthFrameToColorSpace功能。另一种方法是手动进行...重要的是要注意,彩色相机没有“看到”的像素会给你,上面的代码,另一个地方的重复像素(就像我向你展示的那样在图片中用重复的手)
标签: c++ opencv kinect kinect-sdk