C++ Opencv——图像特征

Opencv2

Opencv3

// 特征点
void FeatureAndCompare(cv::Mat srcImage1)
	{
		CV_Assert(srcImage1.data != NULL);
		Mat c_src1 = srcImage1.clone();

		// 转换为灰度
		cv::Mat grayMat1;
		cv::cvtColor(srcImage1, grayMat1, CV_RGB2GRAY);

		//// 加强
		equalizeHist(grayMat1, grayMat1);
		//// 锐化
		sharpenImage1(grayMat1, grayMat1);

		//
		cv::Ptr<cv::BRISK> ptrBrisk = cv::BRISK::create();
		vector<KeyPoint> kp1;
		Mat des1;//descriptor  
		ptrBrisk->detectAndCompute(grayMat1, Mat(), kp1, des1);

		Mat res1;
		int drawmode = DrawMatchesFlags::DRAW_RICH_KEYPOINTS;
		drawKeypoints(c_src1, kp1, res1, Scalar::all(-1), drawmode);//画出特征点  
		//
		//std::cout << "size of description of Img1: " << kp1.size() << endl;
		//	
		namedWindow("drawKeypoints", 0);
		imshow("drawKeypoints", c_src1);
		cvWaitKey(0);
	}
//brisk
	void brisk_feature(Mat src1, Mat src2)
	{
		cv::cvtColor(src1, src1, CV_RGB2GRAY);
		cv::cvtColor(src2, src2, CV_RGB2GRAY);
		// 加强
		equalizeHist(src1, src1);
		equalizeHist(src2, src2);
		// 锐化
		//sharpenImage1(src1, src1);
		//sharpenImage1(src2, src2);

		Ptr<BRISK> brisk = BRISK::create();
		vector<KeyPoint>keypoints1, keypoints2;
		Mat descriptors1, descriptors2;
		brisk->detectAndCompute(src1, Mat(), keypoints1, descriptors1);
		brisk->detectAndCompute(src2, Mat(), keypoints2, descriptors2);
		Mat dst1,dst2;
		drawKeypoints(src1, keypoints1, dst1);
		drawKeypoints(src2, keypoints2, dst2);
		namedWindow("output1", 0);
		imshow("output1", dst1);
		waitKey();
		namedWindow("output2", 0);
		imshow("output2", dst2);
		waitKey();

		BFMatcher matcher;
		vector<DMatch>matches;
		matcher.match(descriptors1, descriptors2, matches);
		Mat match_img;
		drawMatches(src1, keypoints1, src2, keypoints2, matches, match_img);
		namedWindow("match_img", 0);
		imshow("match_img", match_img);

		double minDist = 1000;
		for (int i = 0; i < descriptors1.rows; i++)
		{
			double dist = matches[i].distance;
			if (dist < minDist)
			{
				minDist = dist;
			}
		}
		printf("min distance is:%f\n", minDist);

		vector<DMatch>goodMatches;
		for (int i = 0; i < descriptors1.rows; i++)
		{
			double dist = matches[i].distance;
			if (dist < max(1.8*minDist, 0.02))
			{
				goodMatches.push_back(matches[i]);
			}
		}
		Mat good_match_img;
		drawMatches(src1, keypoints1, src2, keypoints2, goodMatches, good_match_img, Scalar::all(-1), Scalar::all(-1), vector<char>(), 2);
		namedWindow("goodMatch", 0);
		imshow("goodMatch", good_match_img);
		waitKey(0);
}

猜你喜欢

转载自blog.csdn.net/weixin_41275726/article/details/85160178