5

OpenCV (2.43) の ORB を使用して機能を追跡するプログラムを作成してい ます。このチュートリアルに従い、 hereのアドバイスを使用しました。

私の目標は、ビデオ フィード (顔) でオブジェクトを追跡し、その周りに四角形を描くことです。

私のプログラムはキーポイントを見つけて正しく一致させますが、findHomography+perspectiveTransformを使用して画像の新しいコーナーを見つけようとすると、通常、意味のない型の値が返されます (正しいホモグラフィが返されることもあります)。

ここに例の写真があります: 例

対応する問題のある部分は次のとおりです。

Mat H = findHomography( obj, scene, CV_RANSAC );  

//-- Get the corners from the image_1 ( the object to be "detected" )
std::vector<Point2f> obj_corners(4);
obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint( img_object.cols, 0 );
obj_corners[2] = cvPoint( img_object.cols, img_object.rows ); obj_corners[3] = cvPoint( 0, img_object.rows );
std::vector<Point2f> scene_corners(4);

perspectiveTransform( obj_corners, scene_corners, H);

//-- Draw lines between the corners (the mapped object in the scene - image_2 )
line( img_matches, scene_corners[0] + Point2f( img_object.cols, 0), scene_corners[1] + Point2f( img_object.cols, 0), Scalar(0, 255, 0), 4 );
line( img_matches, scene_corners[1] + Point2f( img_object.cols, 0), scene_corners[2] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
line( img_matches, scene_corners[2] + Point2f( img_object.cols, 0), scene_corners[3] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
line( img_matches, scene_corners[3] + Point2f( img_object.cols, 0), scene_corners[0] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );

コードの残りの部分は、私が提供したリンクと実質的に同じです。描かれた線は完全にランダムに見えます。私の目標は、新しいシーンでソース オブジェクトの最小限の長方形を取得することだけです。

追跡するPSソース画像は、ビデオ入力からコピーされ、その入力からの新しい画像で追跡される領域です。それは重要ですか?

4

1 に答える 1

0

この関数perspectiveTransformは、対応するポイント セットがエラーを起こしにくいという仮定の下でホモグラフィを推定します。ただし、実際のデータでは、それを想定することはできません。解決策は、RANSAC などの堅牢な推定関数を使用して、ホモグラフィ問題を過決定方程式系として解くことです。

findHomography代わりに、ホモグラフィを返す関数を使用できます。この関数の入力は点の集合です。このセットには少なくとも 4 ポイントが必要ですが、より大きなセットの方が優れています。ホモグラフィは推定値にすぎませんが、エラーに対してより堅牢です。CV_RANSACフラグを使用することで、外れ値 (間違った点の対応) を内部的に除去できます。

于 2016-06-01T20:03:14.863 に答える