我从两个相机旁边拍摄的两张照片。图片几乎相同,但其中一张我有一些雨滴,我需要比较和组合这两张照片在同一张图片中结果(当然消除了降雨),结果。
实际上我使用了很多我在网上找到的方法,但是我没有得到我需要的结果。首先,我试图找到所有的通信点,然后我找到了很多通信点然后,我试图消除所有的"坏"比赛最后只有#34;好"点。我使用了here is the tutorial。
其次,我使用OpenCV库提供的affine transformation method来了解这些点从一个图像到另一个图像发生的转换,不幸的是我得到了一个非常错误的结果。 (我想因为我有点和它们的坐标我现在需要知道矩阵M本身)。 这是我尝试过的代码,如果它是一个新手以及这是我第一次使用这种工作而写得非常好。
vector<KeyPoint> keypoints1;
vector<KeyPoint> keypoints2;
Mat descriptors1, descriptors2;
cv::Ptr<cv::AKAZE> akaze = cv::AKAZE::create();
akaze->detectAndCompute(Src1, cv::Mat(), keypoints1, descriptors1);
akaze->detectAndCompute(Src2, cv::Mat(), keypoints2, descriptors2);
vector<vector<cv::DMatch>> knnmatch_points;
cv::BFMatcher match(cv::NORM_HAMMING);
match.knnMatch(descriptors1, descriptors2, knnmatch_points, 2);
const double match_par = 0.4;
vector<cv::DMatch> goodMatch;
vector<cv::Point2f> match_point1;
vector<cv::Point2f> match_point2;
for (size_t i = 0; i < knnmatch_points.size(); ++i) {
double distance1 = knnmatch_points[i][0].distance;
double distance2 = knnmatch_points[i][1].distance;
if (distance1 <= distance2 * match_par) {
goodMatch.push_back(knnmatch_points[i][0]);
match_point1.push_back(keypoints1[knnmatch_points[i][0].queryIdx].pt);
match_point2.push_back(keypoints2[knnmatch_points[i][0].trainIdx].pt);
...
srcTri[i] = Point2f(keypoints1[knnmatch_points[i][0].queryIdx].pt);
dstTri[i] = Point2f(keypoints2[knnmatch_points[i][0].queryIdx].pt);
}
}
cv::Mat masks;
cv::Mat H = cv::findHomography(match_point1, match_point2, masks, cv::RANSAC, 3);
vector<cv::DMatch> inlinerMatch;
for (size_t i = 0; i < masks.rows; ++i) {
uchar *inliner = masks.ptr<uchar>(i);
if (inliner[0] == 1) {
inlinerMatch.push_back(goodMatch[i]);
}
}
warp_mat = getAffineTransform(srcTri, dstTri);
warpAffine(Src2, warp_dst, warp_mat, warp_dst.size());
namedWindow(warp_window, WINDOW_AUTOSIZE);
imshow(warp_window, warp_dst);
我想我可以使用其他方法来获取我的结果,如二进制搜索,以找到错误或梯度下降,以最小化方程系统,但我不是很熟悉它们中的任何一个..所以,如果有任何帮助请这个主题 在此先感谢,任何帮助将非常感激