我正在尝试从使用 kinect 获取的深度图像中减去背景。当我了解 otsu 阈值是什么时,我认为它可以做到。将深度图像转换为灰度我希望可以应用 otsu 阈值来对图像进行二值化。
但是我用 OpenCV 2.3 实现(试图实现)这个,它是徒劳的。然而,输出图像被二值化,非常出乎意料。我连续进行了阈值处理(即将结果打印到屏幕上以对每一帧进行分析),发现某些帧的阈值是 160ish,有时发现为 0。我不太明白为什么会这样。可能是由于 kinect 返回的深度图像中有大量 0,对应的像素无法测量。有没有办法告诉算法忽略值为 0 的像素?或者 otsu 阈值对我想要做的事情不利?
以下是相关代码的一些输出和段。您可能会注意到第二个屏幕截图看起来可以进行一些很好的二值化,但是我想要实现一个能够明显区分场景中椅子对应的像素和背景的像素。
谢谢。
cv::Mat1s depthcv(depth->getHeight(), depth->getWidth());
cv::Mat1b depthcv8(depth->getHeight(), depth->getWidth());
cv::Mat1b depthcv8_th(depth->getHeight(), depth->getWidth());
depthcv.data =(uchar*) depth->getDepthMetaData().Data();
depthcv.convertTo(depthcv8,CV_8U,255/5000.f);
//apply otsu thresholding
cv::threshold(depthcv8, depthcv8_th, 128, 255, CV_THRESH_BINARY|CV_THRESH_OTSU);
std::ofstream output;
output.open("output.txt");
//output << "M = "<< endl << " " << depthcv8 << endl << endl;
cv::imshow("lab",depthcv8_th);
cv::waitKey(1);