关于SiftGPU匹配显示的问题

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);
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值