0

estimateRigidTransform()知られているように、 2 つの型のいずれかで 2 つのパラメーターを関数に渡すことができます。Mat estimateRigidTransform(InputArray src, InputArray dst, bool fullAffine)

  1. cv::Mat frame1, frame2;
  2. std::vector<cv::Point2f> frame1_features, frame2_features;

つまり、たとえば、ビデオの安定化 (シェイク削除) を実装するには、次の 2 つの方法のいずれかを使用できます。

  1. with cv::Mat: opencv を使用したビデオ安定化
cv::Mat frame1 = imread("frame1.png");
cv::Mat frame2 = imread("frame2.png");
Mat M = estimateRigidTransform(frame1, frame2, 0);
warpAffine(frame2, output, M, Size(640,480), INTER_NEAREST|WARP_INVERSE_MAP);
  1. std::vector<cv::Point2f> features;
vector <uchar> status;
vector <float> err;

std::vector <cv::Point2f> frame1_features, frame2_features;
cv::Mat frame1 = imread("frame1.png");
cv::Mat frame2 = imread("frame2.png");
goodFeaturesToTrack(frame1 , frame1_features, 200, 0.01, 30);
goodFeaturesToTrack(frame2 , frame2_features, 200, 0.01, 30);
calcOpticalFlowPyrLK(frame1 , frame2, frame1_features, frame2_features, status, err);

std::vector <cv::Point2f> frame1_features_ok, frame2_features_ok;
for(size_t i=0; i < status.size(); i++) {
 if(status[i]) {
  frame1_features_ok.push_back(frame1_features[i]);
  frame2_features_ok.push_back(frame2_features[i]);
 }
}

Mat M = estimateRigidTransform(frame1_features_ok, frame2_features_ok, 0);
warpAffine(frame2, output, M, Size(640,480), INTER_NEAREST|WARP_INVERSE_MAP);

これらのアプローチのどれを使用するのが良いですか? また、その理由は何ですか?

つまり、どのタイプMatまたはvector<Point2f>関数の推定RigidTransform()で使用するのが良いですか?

4

1 に答える 1

1

最初のケースでは、OpenCV はcalcOpticalFlowPyrLK()関数内で暗黙的に a を実行しますestimateRigidTransform()lkpyramid.cpp @ line 1383の実装を参照してください。

これが、2 つの方法の唯一の違いです。frame1との間の対応が見つかった場合はframe2、バージョン #2 を使用し、それ以外の場合は #1 を使用します。

于 2015-02-09T15:23:24.967 に答える