насколько я понимаю, официальный Kinect 1.5 SDK поставляется с Face Tracking и Skeleton Tracking. Как насчет простого обнаружения BLOB-объектов? Все, что я хочу сделать, это отслеживать круглый / эллиптический объект. Я не могу найти никакого кода для этого в SDK, так что я должен использовать opencv или какую-то другую библиотеку для этого?
(мой код на с ++)
EDIT1 Можно ли настроить трекер лица, чтобы он обнаруживал круглые формы в целом (вместо лиц)?
EDIT2
Вот код глубокой обработки из примера, поставляемого с SDK. Как мне заставить OpenCV извлечь из него блоб?
void CDepthBasics::ProcessDepth()
{
HRESULT hr;
NUI_IMAGE_FRAME imageFrame;
// Attempt to get the depth frame
hr = m_pNuiSensor->NuiImageStreamGetNextFrame(m_pDepthStreamHandle, 0, &imageFrame);
if (FAILED(hr))
{
return;
}
INuiFrameTexture * pTexture = imageFrame.pFrameTexture;
NUI_LOCKED_RECT LockedRect;
// Lock the frame data so the Kinect knows not to modify it while we're reading it
pTexture->LockRect(0, &LockedRect, NULL, 0);
// Make sure we've received valid data
if (LockedRect.Pitch != 0)
{
BYTE * rgbrun = m_depthRGBX;
const USHORT * pBufferRun = (const USHORT *)LockedRect.pBits;
// end pixel is start + width*height - 1
const USHORT * pBufferEnd = pBufferRun + (cDepthWidth * cDepthHeight);
while ( pBufferRun < pBufferEnd )
{
// discard the portion of the depth that contains only the player index
USHORT depth = NuiDepthPixelToDepth(*pBufferRun);
// to convert to a byte we're looking at only the lower 8 bits
// by discarding the most significant rather than least significant data
// we're preserving detail, although the intensity will "wrap"BYTE intensity = static_cast<BYTE>(depth % 256);
// Write out blue byte
*(rgbrun++) = intensity
// Write out green byte
*(rgbrun++) = intensity;
// Write out red byte
*(rgbrun++) = intensity;
// We're outputting BGR, the last byte in the 32 bits is unused so skip it
// If we were outputting BGRA, we would write alpha here.
++rgbrun;
// Increment our index into the Kinect's depth buffer
++pBufferRun;
}
// Draw the data with Direct2D
m_pDrawDepth->Draw(m_depthRGBX, cDepthWidth * cDepthHeight * cBytesPerPixel);
}
// We're done with the texture so unlock it
pTexture->UnlockRect(0);
// Release the frame
m_pNuiSensor->NuiImageStreamReleaseFrame(m_pDepthStreamHandle, &imageFrame);
}
Получив необходимое изображение от Kinect, не стесняйтесь использовать любую библиотеку обработки изображений с результатом.
Вы можете использовать OpenCV Hough Circle Transform обнаруживать круги. Вам может понадобиться сначала конвертировать из формата изображения Kinect в cv :: Mat.
Я полагаю, что OpenCV — не единственная библиотека с такой функциональностью. Если вам интересно, посмотрите Hough Transforms в общем.
Я не думаю, что настройка трекера лица — это то, что нужно.
Вы можете использовать это, так как, к сожалению, OpenCV не поддерживает обработку больших двоичных объектов: