Kinect и Opencv, глубина изображения, как его использовать - PullRequest
9 голосов
/ 02 апреля 2011

Я использую Kinect и OpenCV (я использую c ++).Я могу получить как RGB, так и изображение глубины.С RGB-изображением я могу «играть» как обычно, размывая его, используя canny (после преобразования в оттенки серого), ... но я не могу сделать то же самое с изображением глубины.Каждый раз, когда я хочу что-то сделать с изображением глубины, я получаю исключения.

У меня есть следующий код для получения изображения глубины:

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1 ); 
CvMat* imageMetersMat = cvCreateMat(480, 640, CV_16UC1 );
IplImage *kinectDepthImage = cvCreateImage( cvSize(640,480),16,1); 

const XnDepthPixel* pDepthMap = depth.GetDepthMap();

for (int y=0; y<XN_VGA_Y_RES; y++){ 
            for(int x=0;x<XN_VGA_X_RES;x++){ 
                depthMetersMat->data.s[y * XN_VGA_X_RES + x ] = 10 * pDepthMap[y * XN_VGA_X_RES + x]; 
          }
}

cvGetImage(depthMetersMat, kinectDepthImage);

Проблема в том, что я не могу сделатьчто-нибудь с kinectDepthImage.Я попытался преобразовать его в оттенки серого, а затем с помощью canny, но я не знаю, как преобразовать его.

В основном я хотел бы применить canny и laplacian к изображению глубины.

Ответы [ 5 ]

5 голосов
/ 02 апреля 2011

Проблема заключалась в том, что вывод cvGetImage имеет глубину 16 бит, а для canny требуется 8 бит, поэтому мне нужно преобразовать его в 8 бит, что-то вроде:

cvConvertScale(depthMetersMat, kinectDepthImage8, 1.0/256.0, 0);
3 голосов
/ 19 мая 2012

Новый OpenCV Api призывает использовать Mat вместо старых типов изображений. Текущий код для использования метаданных глубины OpenNI в OpenCV будет:

Mat depthMat16UC1(width, height, CV_16UC1, (void*) g_DepthMD.Data()); 
Mat depthMat8UC1;
depthMat16UC1.convertTo(depthMat8UC1, CV_8U, 1.0/256.0);
0 голосов
/ 12 июля 2012

если вы используете OpenNI, вы создали контекст, рабочие узлы и начали генерировать данные? Вероятно, это твоя проблема ..

0 голосов
/ 20 апреля 2011

Проверьте код ссылки ниже ... может дать вам ценную информацию. ПРИМЕЧАНИЕ: это не мой код, может дать нужный вам результат. закомментируйте // cvCvtColor (rgbimg, rgbimg, CV_RGB2BGR);

http://pastebin.com/e5kHzs84

С уважением Nagaraju

0 голосов
/ 02 апреля 2011

Каков размер (XnDepthPixel)?

Попробуйте использовать cvCreateImageHeader , а затем выполните cvSetData для него с XnDepth Image

...