kinectで取得した深度画像から背景を差し引こうとしています。大津の二値化とは何かを知ったとき、それでうまくいくと思いました。深度画像をグレースケールに変換すると、大津のしきい値を適用して画像を2値化できると思います。
しかし、私はこれをOpenCV 2.3で実装(実装しようとしました)しましたが、無駄になりました。ただし、非常に予期しないことに、出力イメージは2値化されます。しきい値処理を継続的に実行し(つまり、結果を画面に出力してフレームごとに分析します)、一部のフレームではしきい値が160であることがわかり、場合によっては0であることがわかりました。なぜこれが発生するのかよくわかりませんでした。kinectによって返される深度画像の0の数が多いことが原因である可能性があります。これは、測定できないピクセルに対応します。値が0のピクセルを無視するようにアルゴリズムに指示する方法はありますか?または、大津のしきい値処理は、私がやろうとしていることに適していませんか?
関連するコードのいくつかの出力とセグメントを次に示します。2番目のスクリーンショットは、ある程度の2値化が可能であるように見えるかもしれませんが、シーン内の椅子と背景に対応するピクセルを明確に区別するものを実現したいと思います。
ありがとう。
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);