В настоящее время я разрабатываю инструмент для Kinect для Windows v2 (аналогично тому, как в XBOX ONE). Я попытался следовать некоторым примерам и иметь рабочий пример, который показывает изображение камеры, изображение глубины и изображение, которое отображает глубину в rgb, используя opencv. Но я вижу, что он дублирует мою руку при выполнении сопоставления, и я думаю, что это связано с чем-то неправильным в части координатора координат.Kinect для Windows v2 глубина цвета для рассогласования изображения
вот пример этого:
А вот фрагмент кода, который создает изображение (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:
Если я простой пороговую глубины изображения я получить следующее изображение:
Это то, что более или менее я ожидал случиться, и не имея дублирующей руки в фоновом режиме. Есть ли способ предотвратить эту дублируемую руку в фоновом режиме?
, где происходит это сопоставление из? скорее всего, вам нужно отредактировать калибровку между изображением глубины и цветным изображением, поскольку предварительные определения не идеальны. Поэтому вы должны выполнить свою собственную калибровку. Посмотрите: http://nicolas.burrus.name/index.php/Research/KinectCalibration – Micka
Он поставляется с kinect SDK v2. Я ожидал использовать тот, который исходит от прошивки/SDK, который использует интрисы камеры для выполнения этих вычислений ... но я думаю, что ошибка огромна по сравнению с прошивкой/программным обеспечением других камер, таких как Primesense с openni. Я ожидал лучших результатов или, по крайней мере, похожих на другие камеры .... Спасибо за ссылку, хотя :) – api55
Afaik данные автоматической калибровки kinect, сохраненные в прошивке, не являются таковыми. Но, возможно, я ошибаюсь. – Micka