4

features2d フレームワークで異なる検出器を使用して、2 つの連続した特徴点を取得しました。

最初のフレームでは、特徴点が赤でプロットされます ここに画像の説明を入力

次のフレームでは、特徴点が青色でプロットされます ここに画像の説明を入力

最初のフレーム(赤い点のある画像 )内のこれらの赤と青の(一致した)点の間に線を引きたいと思います。opencvの drawmatches関数は、マッチングのために 2 つの連続するフレームが隣り合ったウィンドウを表示するため、役に立ちません。OpenCVで可能ですか?

前もって感謝します

4

2 に答える 2

2

各キーポイントが 2 つのフレーム間でどのように移動するかを視覚化する必要があると思います。私の知る限り、OpenCV には要件を満たす組み込み関数はありません。

ただし、drawMatches()関数を呼び出したので、既に 2 つのキーポイント セット (例として C++ コードを取り上げます)vector<KeyPoint>& keypoints1, keypoints2とmatch がありvector<DMatch>& matches1to2ます。Point keypoints1.pt次に、関数を呼び出して、各キーポイントのピクセル座標を取得し、キーポイント間に線を引くことができline()ます。

最初のフレームに描画したいのでkeypoints2、ピクセル座標が のサイズを超える可能性があることに注意してくださいimg1

キーポイントの動きをすばやく把握する方法があります。以下は、imshowpair()Matlab で表示される結果です。 ここに画像の説明を入力

于 2014-02-23T14:36:42.123 に答える
1

一致するものが見つかったら、このコードを使用して線を引きます。

(...some code...)

//draw good matches
for( int i = 0; i < (int)good_matches.size(); i++ )
{ 

   printf( "-- Good Match [%d] Keypoint 1: %d  -- Keypoint 2: %d  \n", i, good_matches[i].queryIdx,  good_matches[i].trainIdx ); 

   //query image is the first frame
   Point2f point_old = keypoints_1[good_matches[i].queryIdx].pt;

   //train  image is the next frame that we want to find matched keypoints
   Point2f point_new = keypoints_2[good_matches[i].trainIdx].pt;

   //keypoint color for frame 1: RED
   circle(img_1, point_old, 3, Scalar(0, 0, 255), 1);  
   circle(img_2, point_old, 3, Scalar(0, 0, 255), 1);  

   //keypoint color for frame 2: BLUE
   circle(img_1, point_new, 3, Scalar(255, 0, 0), 1);  
   circle(img_2, point_new, 3, Scalar(255, 0, 0), 1); 

   //draw a line between keypoints
   line(img_1, point_old, point_new, Scalar(0, 255, 0), 2, 8, 0);
   line(img_2, point_old, point_new, Scalar(0, 255, 0), 2, 8, 0); 
}
  imwrite("directory/image1.jpg",img_1);
  imwrite("directory/image2.jpg",img_2);

(...some code...)

結果を最初のフレーム (img_1) と次のフレーム (img_2) に保存しました。ご覧のとおり、結果は異なりますが、線の形は同じです。OpenCV のビデオ ホモグラフィ サンプルでは、​​キーポイント トラッキングは正確なようです。キーポイントの検出 -> キーポイントの計算 -> キーポイントのワープ -> 一致 -> ホモグラフィの検索 -> 一致の描画というアプローチに従います。ただし、detect keypoints-->compute keypoints-->match-->draw matchesを適用します。キーポイントの動きを正確に見るために、ホモグラフィとパースペクティブ (またはその他のこと) を考慮する必要がある場合、私は混乱します。

最初のフレームの結果 (img_1) ここに画像の説明を入力

そして次のフレーム (img_2) ここに画像の説明を入力

于 2014-03-03T19:08:45.057 に答える