SiftGPU显示很麻烦需要使用openGL的一些库
但是我们可以转换成opencv去直接显示
matcher->SetDescriptors(0, num1, &descriptors1[0]); //image 1
matcher->SetDescriptors(1, num2, &descriptors2[0]); //image 2
int(*match_buf)[2] = new int[num1][2];
int num_match = matcher->GetSiftMatch(num1, match_buf);
std::cout << num_match << " sift matches were found;\n";
vector<SiftGPU::SiftKeypoint> keyPoint1, keyPoint2;
for (int i = 0; i < num_match; ++i)
{
//How to get the feature matches:
//如何获得功能匹配:
//SiftGPU::SiftKeypoint & key1 = keys1[match_buf[i][0]];
keyPoint1.push_back(keys1[match_buf[i][0]]);
keyPoint2.push_back(keys2[match_buf[i][1]]);
//SiftGPU::SiftKeypoint & key2 = keys2[match_buf[i][1]];
//key1 in the first image matches with key2 in the second image
//第一个图像中的key1与第二个图像中的key2匹配
}
cv::Mat limg_0 = img1.clone();
cv::Mat rimg_0 = img2.clone();
std::string filename1 = "result_1.png";
showCorrespondence(keyPoint1, keyPoint2, limg_0, rimg_0, filename1);
//坐标转换
vector<cv::Point2f>p01, p02;
cv::Point2f a1;
cv::Point2f a2;
for (size_t i = 0; i < num_match; i++)
{
a1.x = keyPoint1[i].x;
a1.y = keyPoint1[i].y;
a2.x = keyPoint2[i].x;
a2.y = keyPoint2[i].y;
p01.push_back(a1);
p02.push_back(a2);
}
vector<uchar> RansacStatus;
cv::Mat Fundamental = cv::findFundamentalMat(p01, p02, RansacStatus, cv::FM_RANSAC);
vector<SiftGPU::SiftKeypoint> good_keyPoint1, good_keyPoint2;
SiftGPU::SiftKeypoint temp;
for (size_t i = 0; i < num_match; i++)
{
if (RansacStatus[i] != 0)
{
temp = keyPoint1[i];
good_keyPoint1.push_back(temp);
temp = keyPoint2[i];
good_keyPoint2.push_back(temp);
}
}
std::string filename2 = "result_2.png";
showCorrespondence(good_keyPoint1, good_keyPoint2, img1, img2, filename2);
cv::cvtColor(grayImg1, grayImg1, CV_GRAY2BGR);
cv::cvtColor(grayImg2, grayImg2, CV_GRAY2BGR);
std::string filename3 = "result_3.png";
showCorrespondence(good_keyPoint1, good_keyPoint2, grayImg1, grayImg2, filename3);
void showCorrespondence(vector<SiftGPU::SiftKeypoint> &siftData1, vector<SiftGPU::SiftKeypoint> &siftData2, cv::Mat limg_0, cv::Mat rimg_0, std::string filename)
{
int numPts = siftData1.size();
int w = limg_0.size().width;
int h = limg_0.size().height;
cv::resize(rimg_0, rimg_0, cv::Size(w, h));
cv::Mat img_m = cv::Mat::zeros(h, 2 * w, CV_8UC3);
limg_0.copyTo(img_m(cv::Rect(0, 0, w, h)));
rimg_0.copyTo(img_m(cv::Rect(w, 0, w, h)));
for (int j = 0; j < numPts; j++)
{
cv::circle(img_m, cv::Point(siftData1[j].x, siftData1[j].y), 2, cv::Scalar(60, 20, 220), 2);
cv::circle(img_m, cv::Point(siftData2[j].x + w, siftData2[j].y), 2, cv::Scalar(255, 0, 0), 2);
cv::line(img_m, cv::Point(siftData1[j].x, siftData1[j].y), cv::Point(siftData2[j].x + w, siftData2[j].y), cv::Scalar(0, 255, 0), 1);
}
//cv::namedWindow("Result");
//cv::resizeWindow("Result", cv::Size(600, 300));
//cv::imshow("Result", img_m);
//cv::waitKey(1000);
cv::imwrite(filename, img_m);
}