В настоящее время я разрабатываю инструмент для Kinect для Windows v2 (аналогично тому, как в XBOX ONE). Я попытался следовать некоторым примерам и иметь рабочий пример, который показывает изображение камеры, изображение глубины и изображение, которое отображает глубину в rgb, используя opencv. Но я вижу, что он дублирует мою руку при выполнении сопоставления, и я думаю, что это связано с чем-то неправильным в части координатора координат.
вот пример:
И вот фрагмент кода, который создает изображение (образ 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);
}
}
}
}
}
Кто-нибудь знает, как это решить? Как предотвратить это дублирование?
Заранее спасибо
UPDATE:
Если я делаю простой порог изображения глубины, я получаю следующее изображение:
Это то, что более или менее я ожидал, и не иметь дублирующую руку в фоновом режиме. Есть ли способ предотвратить эту дублируемую руку в фоновом режиме?