простое обнаружение BLOB-объектов с помощью Kinect SDK

насколько я понимаю, официальный 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);
}

0

Решение

Получив необходимое изображение от Kinect, не стесняйтесь использовать любую библиотеку обработки изображений с результатом.

Вы можете использовать OpenCV Hough Circle Transform обнаруживать круги. Вам может понадобиться сначала конвертировать из формата изображения Kinect в cv :: Mat.

Я полагаю, что OpenCV — не единственная библиотека с такой функциональностью. Если вам интересно, посмотрите Hough Transforms в общем.

Я не думаю, что настройка трекера лица — это то, что нужно.

1

Другие решения

Вы можете использовать это, так как, к сожалению, OpenCV не поддерживает обработку больших двоичных объектов:

http://opencv.willowgarage.com/wiki/cvBlobsLib

1

По вопросам рекламы [email protected]