特徴検出には SIFT を使用し、画像の特徴追跡には calcOpticalFlowPyrLK を使用しています。Microsoft kinect から取得した低解像度画像 (トリミング後 590x375) に取り組んでいます。
// feature detection
cv::Ptr<Feature2D> detector = cv::xfeatures2d::SIFT::create();
detector->detect(img_1,keypoints_1);
KeyPoint::convert(keypoints_1, points1, vector<int>());
// feature tracking
vector<float> err;
Size winSize=Size(21,21);
TermCriteria termcrit=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01);
calcOpticalFlowPyrLK(img_1, img_2, points1, points2, status, err, winSize, 1, termcrit, 0, 0.001);
これを、同じカメラ位置から 30fps の速度で撮影した安定したシーンの連続した画像 (アイデアを得るために) で実行しました。目には、画像は同じように見えますが、なぜか calcOpticalFlowPyrLK はある画像から別の画像へ同じ特徴を追跡できません。位置 (x,y 座標) は、検出されたフィーチャと追跡されたフィーチャで同じである必要があります。どういうわけかそうではありません。
AldurDisciple の提案によると、ノイズを特徴として検出していると思います。下の黒い画像は、導電要素間の違いであり、ノイズを示しています。次は元の画像で、次に特徴が検出された画像です。
私の目標は、情報を使用して、時間の経過に伴うロボットの位置の変化を見つけることです。
使った
GaussianBlur( currImageDepth, currImageDepth, Size(9,9), 0, 0);
ノイズのためにしかし、それは助けにはなりませんでした。