Mat 或 vector<Point2f> 中哪种类型更适合与函数 estimateRigidTransform() 一起使用?
Which of types Mat or vector<Point2f> is better to use with function estimateRigidTransform()?
众所周知,我们可以向函数 estimateRigidTransform()
传递两个具有以下两种类型之一的参数:Mat estimateRigidTransform(InputArray src, InputArray dst, bool fullAffine)
cv::Mat frame1, frame2;
std::vector<cv::Point2f> frame1_features, frame2_features;
例如,为了实现视频稳定(抖动消除),我们可以使用以下两种方法之一:
- 与
cv::Mat
: video stabilization using 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);
- 和
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>
更适合与函数 estimateRigidTransform() 一起使用?
在第一种情况下,OpenCV 将在函数 estimateRigidTransform()
中隐式执行 calcOpticalFlowPyrLK()
。请参阅 lkpyramid.cpp @ line 1383 中的实现。
这是两种方法的唯一区别。如果找到 frame1
和 frame2
之间的对应关系很重要,则使用版本 #2,否则使用版本 #1.
众所周知,我们可以向函数 estimateRigidTransform()
传递两个具有以下两种类型之一的参数:Mat estimateRigidTransform(InputArray src, InputArray dst, bool fullAffine)
cv::Mat frame1, frame2;
std::vector<cv::Point2f> frame1_features, frame2_features;
例如,为了实现视频稳定(抖动消除),我们可以使用以下两种方法之一:
- 与
cv::Mat
: video stabilization using 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);
- 和
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>
更适合与函数 estimateRigidTransform() 一起使用?
在第一种情况下,OpenCV 将在函数 estimateRigidTransform()
中隐式执行 calcOpticalFlowPyrLK()
。请参阅 lkpyramid.cpp @ line 1383 中的实现。
这是两种方法的唯一区别。如果找到 frame1
和 frame2
之间的对应关系很重要,则使用版本 #2,否则使用版本 #1.