获取物体的深度距离

时间:2015-06-11 20:02:05

标签: opencv kinect openni object-detection

我正在尝试使用Kinect,Openni 2.2.0.33和OpenCV 2.4.10获取对象的世界坐标。 我开发了一个运行良好的代码,并获得了对象的X,Y和Z坐标值。但是这里有一些奇怪的地方......对于房间里的某些地方我会得到连贯的价值,但是对于房间里的其他地方我得到的价值完全不可接受,例如,而不是2米,我获得了6米! 我不确定我的代码,设备,甚至驱动器是否有问题。 我的猜测是问题在于deph的返回(我不确定这是以像素还是mm或其他任何东西)。按照我的代码,请任何帮助将不胜感激!

sVideo.readFrame(&vFrame);
sVideoDepth.readFrame(&vFrameDepth); //Depth

matrizFrame.create(vFrame.getHeight(), vFrame.getWidth(), CV_8UC3); //cria matrizFrame
bufferImage.create(vFrame.getHeight(), vFrame.getWidth(), CV_8UC3); //cria matrizBuffer
IdentifyRed.create(vFrame.getHeight(), vFrame.getWidth(), CV_8UC3);
HSVImage.create(vFrame.getHeight(), vFrame.getWidth(), CV_8UC3); //create HSVImage
depthImage.create(vFrameDepth.getHeight(), vFrameDepth.getWidth(), CV_16UC1); //create DepthImage
bufferImage.data = (uchar*)vFrame.getData(); 

depthImage.data = (uchar*)vFrameDepth.getData(); //Depth
cv::cvtColor(bufferImage, matrizFrame, CV_BGR2RGB); //converte a matriz bufferImage de BGR para RGB e atribui a matrizFrame
cv::cvtColor(matrizFrame, HSVImage, CV_BGR2HSV); //converte a matriz bufferImage de BGR oara HSI e atribui a HSVImage

cv::inRange(HSVImage,cv::Scalar(160,80,80),cv::Scalar(255,255,255), IdentifyRed); //identify a red object
cv::erode(IdentifyRed, IdentifyRed, estruturaElemento);
cv::dilate(IdentifyRed,IdentifyRed, estruturaElemento);

red_2D = getCoordenadas2D(IdentifyRed); //function that get the 2D pixel coordinates of the object

ushort distanceRed = depthImage.at<ushort>(red_2D.x, red_2D.y); //using the 2D coordinate of the object in the color image, get the distance of the correspondent pixel in the DepthImage

openni::DepthPixel depthRed = distanceRed;

red_3D = getCoordenadas3D(red_2D.x, red_2D.y, depthRed); //use the function "openni::CoordinateConverter::convertDepthToWorld" to get the 3D world coordinates.

根据Openni文档,返回值应为mm,但Z的输出与输入(distanceRed)值完全相等。此外,对于房间里的许多地方,这个值是不可接受的!!

顺便说一下这是我在这里的第一篇文章,所以如果我做错了,我很抱歉。提前谢谢。

0 个答案:

没有答案