【OpenCV学习笔记】三十五、角点检测简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc8730866/article/details/69945634

角点检测简介

1.Harris角点检测--cornerHarris()

2.Shi-Tomasi角点检测--goodFeaturesToTrack()

3.亚像素角点检测---cornerSubPix()

先上ppt;
















代码:1.Harris角点检测--cornerHarris()

///Harris角点检测--cornerHarris()
#include "opencv2/opencv.hpp"
using namespace cv;
int main()
{
	Mat srcImg = imread("3.jpg",CV_LOAD_IMAGE_COLOR);
	Mat srcImg_gray;//存储原图像的灰度图,cornerHarris()输入图需为8位单通道或浮点类型图像
	cvtColor(srcImg, srcImg_gray, CV_BGR2GRAY);
	Mat cornerImg;//存放Harris角点检测结果, 类型为CV_32FC1, 大小和原图一样
	cornerHarris(srcImg_gray, cornerImg, 3, 3, 0.04);
	//cornerImg是32位浮点型,值都很小,图像看起来像纯黑一样
	//用对cornerImg阈值化筛选自己要的角点
	imshow("cornerImg", cornerImg);
	Mat dstImg;//存放对cornerImg阈值化筛选后的结果
	threshold(cornerImg,dstImg,0.01,255,CV_THRESH_BINARY);//阈值可用滑动条进行Debug
	imshow("dstImg", dstImg);
	//遍历dstImg,像素为255的点,在原图srcImg上用圆画出
	for (int i = 0;i<dstImg.rows;i++)
	{
		for (int j = 0;j<dstImg.cols;j++)
		{
			if (dstImg.at<float>(i, j) == 255)
			{
				circle(srcImg, Point(j, i), 3, Scalar(0,255,0),2);
			}
		}
	}
	imshow("cornerHarris-srcImg", srcImg);
	waitKey(0);
	return 0;
}

运行结果:





代码:2.Shi-Tomasi角点检测--goodFeaturesToTrack()

///Shi-Tomasi角点检测--goodFeaturesToTrack()
#include "opencv2/opencv.hpp"
using namespace cv;
#include<iostream>
using namespace std;
int main()
{
	Mat srcImg = imread("3.jpg", CV_LOAD_IMAGE_COLOR);
	Mat srcImg_gray;////存储原图像的灰度图,goodFeaturesToTrack()输入图需为8位单通道或浮点类型图像
	cvtColor(srcImg,srcImg_gray,CV_BGR2GRAY);
	vector<Point2f> corners;//记录检测到的角点的输出向量
	goodFeaturesToTrack(srcImg_gray, corners, 100, 0.01, 10);
	cout << corners.size() << endl;
	cout << corners << endl;
	for (int i = 0; i < corners.size(); i++)//遍历存放检测到角点的向量
	{
		circle(srcImg,corners[i],3,Scalar(0,255,0),2);//在原图srcImg上画出角点
	}
	imshow("Shi-Tomasi角点检测", srcImg);
	waitKey(0);
	return 0;
}
运行结果:




代码:3.亚像素角点检测---cornerSubPix()

///亚像素角点检测---cornerSubPix()
#include "opencv2/opencv.hpp"
using namespace cv;
#include<iostream>
using namespace std;
int main()
{
	//1.Shi-Tomasi角点检测--goodFeaturesToTrack(),得到corners
	Mat srcImg = imread("3.jpg", CV_LOAD_IMAGE_COLOR);
	Mat srcImg_gray;////存储原图像的灰度图,goodFeaturesToTrack()输入图需为8位单通道或浮点类型图像
	cvtColor(srcImg, srcImg_gray, CV_BGR2GRAY);
	vector<Point2f> corners;//记录检测到的角点的输出向量
	goodFeaturesToTrack(srcImg_gray, corners, 100, 0.01, 10);
	cout << corners.size() << endl;
	cout << corners << endl;
	for (int i = 0; i < corners.size(); i++)//遍历存放检测到角点的向量
	{
		circle(srcImg, corners[i], 3, Scalar(0, 255, 0), 2);//在原图srcImg上用绿色画出角点
	}
	imshow("Shi-Tomasi角点检测", srcImg);
	//2.亚像素角点检测--cornerSubPix()
	//TermCriteria类型的对象, 表示求角点的迭代过程的终止条件
	TermCriteria criteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 40, 0.001);
	//亚像素角点检测将前面的角点检测方法得到的像素级坐标,变为更高的精度比如亚像素(浮点坐标)精度
	//所以对于亚像素角点检测,corners既是输入也是输出
	cornerSubPix(srcImg_gray,corners,Size(5,5),Size(-1,-1),criteria);
	cout << corners.size() << endl;
	cout << corners << endl;
	for (int i = 0; i < corners.size(); i++)//遍历存放检测到角点的向量
	{
		circle(srcImg, corners[i], 3, Scalar(0, 0, 255), 2);//在原图srcImg上用红色画出角点
	}
	imshow("亚像素角点检测", srcImg);//绿色是之前角点检测方法的点,红色是亚像素角点检测更精确的点
	waitKey(0);
	return 0;
}

运行结果:




猜你喜欢

转载自blog.csdn.net/abc8730866/article/details/69945634
今日推荐