【OpenCV学习笔记】三十五、角点检测简介
2017-04-10 13:30
531 查看
角点检测简介
1.Harris角点检测--cornerHarris()
2.Shi-Tomasi角点检测--goodFeaturesToTrack()
3.亚像素角点检测---cornerSubPix()
先上ppt;
![](https://img-blog.csdn.net/20170410132420821)
![](https://img-blog.csdn.net/20170410132423151)
![](https://img-blog.csdn.net/20170410132425587)
![](https://img-blog.csdn.net/20170410132427948)
![](https://img-blog.csdn.net/20170410132430712)
![](https://img-blog.csdn.net/20170410132433321)
![](https://img-blog.csdn.net/20170410132436464)
![](https://img-blog.csdn.net/20170410132439962)
代码: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;
}
运行结果:
![](https://img-blog.csdn.net/20170410132718451)
![](https://img-blog.csdn.net/20170410132723139)
![](https://img-blog.csdn.net/20170410132727326)
代码: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;
}运行结果:
![](https://img-blog.csdn.net/20170410132732760)
代码: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;
}
运行结果:
![](https://img-blog.csdn.net/20170410132737139)
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;
}
运行结果:
相关文章推荐
- 【OpenCV学习笔记】1.1简介环境搭建
- 【OpenCV学习笔记1】OpenCV 编程简介[轉]
- Opencv学习笔记之:(1)Opencv简介
- opencv学习笔记之5.4使用形态学滤波进行边缘和角点检测
- OpenCV学习笔记(一)———OpneCV库简介(3.1.0)
- opencv学习笔记0 编程简介入门
- jBPM-jPDL学习笔记—框架设计简介
- OpenCV学习笔记(一)
- UML学习笔记(一):UML简介
- jBPM-jPDL学习笔记—框架设计简介(五)
- awk简介与学习笔记收集第1/3页
- jBPM-jPDL学习笔记—框架设计简介(四)
- OpenCV学习笔记(一)
- PHP学习笔记(5)----phplib的简介及安装[原创]
- jBPM-jPDL学习笔记—框架设计简介(二)
- jBPM-jPDL学习笔记—框架设计简介(三)
- HTML 简介(学习笔记一)
- SQL Server 2005盛宴系列之一:SQL Server 2005产品简介-----学习笔记
- Jpcap包的学习笔记(二)Jpcap的功能简介
- 懒人的UML学习笔记1——UML简介