您的位置:首页 > 运维架构

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

2017-04-10 13:30 531 查看
角点检测简介

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 < co
aca2
rners.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;
}
运行结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: