Moravec点特征提取算子c++

#include 
#include
using namespace std;
using namespace cv;
vectorfeaturPoints;
int k = 2;//设定窗口大小为5*5,K取值为(int)窗口大小/2
int ksize = 32;//抑制窗口大小,可以调整
int main()
{
	Mat src = imread("D:\\Software\\VS2019\\source\\repos\\摄影测量与三维重建\\1.Moravec点特征提取算子\\data\\1.jpg", IMREAD_GRAYSCALE);
	Mat candidatepPoints = Mat::zeros(src.rows, src.cols, CV_8UC1);//存储候选点
	int threshold = 100;
	//1.计算各像素兴趣值
	for (int c = k; c < src.rows - k; c++)
	{
		for (int r = k; r < src.cols - k; r++)
		{
			int V1 = 0, V2 = 0, V3 = 0, V4 = 0;
			for (int i = -k; i <= k - 1; i++)
			{
				V1 += (src.at(c + i, r) - src.at(c + i + 1, r)) * (src.at(c + i, r) - src.at(c + i + 1, r));
				V2 += (src.at(c + i, r + i) - src.at(c + i + 1, r + i + 1)) * (src.at(c + i, r + i) - src.at(c + i + 1, r + i + 1));
				V3 += (src.at(c, r + i) - src.at(c, r + i + 1)) * (src.at(c, r + i) - src.at(c, r + i + 1));
				V4 += (src.at(c + i, r - i) - src.at(c + i + 1, r - i - 1)) * (src.at(c + i, r - i) - src.at(c + i + 1, r - i - 1));
			}
			int IV = min(min(V1, V2), min(V3, V4));
			candidatepPoints.at(c, r) = IV;
		}
	}
	cout << "候选点选取完毕" << endl;
	//2.根据阈值筛选候选点,并根据局部最大值进行局部最大值抑制选择特征点
	for (int c = ksize; c < src.rows - ksize; c += ksize)
	{
		for (int r = ksize; r < src.cols - ksize; r += ksize)
		{
			int max = 0;
			int Flag = 0;
			Point2f point;
			for (int i = -ksize; i <= ksize; i++)
			{
				for (int j = -ksize; j <= ksize; j++)
				{
					int value = candidatepPoints.at(c + i, r + j);
					//局部非最大值抑制
					if (value > max)
					{
						max = value;
						point.x = r + j;
						point.y = c + i;
						Flag = 1;
					}
				}
			}
			if (Flag == 1 && max > threshold)
			{//存储特征点的坐标
				featurPoints.push_back(point);
			}
		}
	}
	cout << "特征点个数:" << featurPoints.size() << endl;
	Mat img = imread("D:\\Software\\VS2019\\source\\repos\\摄影测量与三维重建\\1.Moravec点特征提取算子\\data\\1.jpg", IMREAD_COLOR);
	//3.绘制特征点
	for (int i = 0; i < featurPoints.size(); i++)
	{
		int centerx = featurPoints[i].x;
		int centery = featurPoints[i].y;
		circle(img, Point(centerx, centery), 4, Scalar(255, 0, 0), 2);
	}
	imwrite("D:\\Software\\VS2019\\source\\repos\\摄影测量与三维重建\\1.Moravec点特征提取算子\\result\\Moravec点特征提取算子.jpg", img);
	cv::waitKey(0);
	return 0;
}

配置好openCV,修改图像的位置,兴趣窗口大小,阈值(多试试,多调整,我也是调整好多次才确定下来),抑制窗口大小根据你的图像适当调整就可以运行了。原理就不赘述了,你来搜肯定就已经阅读过相关的文字资料了。

参考教材:张祖勋《数字摄影测量学》

测试图像:

Moravec点特征提取算子c++_第1张图片

 运行结果(局部放大图):该检测出来的角点都有,但是因为是自己拍摄的图像,所以受环境和相机影响,很多多余的点被检测出来了,不过无所谓喽......

Moravec点特征提取算子c++_第2张图片

 

你可能感兴趣的:(c++,开发语言)