分享

2. Shi-Tomasi 角点检测

 心不留意外尘 2016-03-28

from http://blog.sina.com.cn/s/blog_96b836170102w1ki.html

本博文原理部分简述,重点在编程实现(程序参考并修改了网上资料,网上程序不一定能运行,但本文程序亲测能跑)

Shi-Tomasi 算法是Harris 算法的改进。Harris 算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。后来Shi Tomasi 提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。

//ShiTomas

#include "stdafx.h"

#include

#include

#include

#include "opencv2/opencv.hpp"

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/features2d/features2d.hpp" 

#include

#include

#include

#include

 

using namespace cv;

using namespace std;

 

/// 全局变量

Mat src, srcGray;

int maxCorners = 23;        //角点个数的最大值

int maxCornersThresh = 1000; //角点个数最大值的上限(滑动条范围0-1000

 

RNG rng(12345);

char* sourceWindow = "src";

 

/// 角点检测函数声明

void doGoodFeaturesToTrack(int, void*);

 

int main(int argc, char** argv)

{

         /// 载入图像并灰度化

         src = imread("C:\\Users\\Administrator\\Desktop\\qi.jpg", 1);

         cvtColor(src, srcGray, CV_BGR2GRAY);

 

         /// 创建显示窗口以及滑动条

         //namedWindow(sourceWindow, CV_WINDOW_AUTOSIZE);

         //createTrackbar("max num:", sourceWindow, &maxCorners, maxCornersThresh, doGoodFeaturesToTrack);

         imshow(sourceWindow, src);

 

         doGoodFeaturesToTrack(0, 0);

 

         waitKey(0);

         return(0);

}

 

/// 角点检测函数实现:标示出每个角点位置

void doGoodFeaturesToTrack(int, void*)

{

         if(maxCorners < 1)

                   maxCorners = 1;

 

         /// Shi-Tomasi的参数设置

         vector<</span>Point2f> corners;

         doublequalityLevel = 0.01;

         doubleminDistance = 10;

         intblockSize = 3;

         booluseHarrisDetector = false         //不使用Harris检测算法

         doublek = 0.04;

 

         /// 深度拷贝原图像用于绘制角点

         MatsrcCopy = src.clone();

         /// 应用角点检测算法

         goodFeaturesToTrack(srcGray,

                   corners,

                   maxCorners,

                   qualityLevel,

                   minDistance,

                   Mat(),       //未选择感兴趣区域

                   blockSize,

                   useHarrisDetector,

                   k);

 

         /// maxCorners的值较小时,以下两个值基本是一样的;

         /// maxCorners的值较大时,实际检测到的角点数目有可能小于maxCorners,以下两个值不一样。

         cout << "*  detected corners : " << corners.size() << endl;

         cout << "** max corners: " << maxCorners << endl;

 

         /// 绘制出角点

         intr = 4;

         for(int i = 0; i < corners.size(); i++)

                   circle(srcCopy, corners[i], r, Scalar(0, 255, 0), -1, 8, 0);

 

         /// 显示结果

         namedWindow(sourceWindow, CV_WINDOW_AUTOSIZE);

         imshow(sourceWindow, srcCopy);

}


效果图:

2.Shi-Tomas角点检测

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约