OpenCV特征提取与检测之Shi-Tomasi角点检测器

前言

角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界。角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维重建和目标识别等,也可称为特征点检测。

角点检测算法的基本思想:

使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。

目前,角点检测算法还不是十分完善,许多算法需要依赖大量的训练集和冗余数据来防止和减少错误的特征的出现。对于角点检测算法的重要评价标准是:其对多幅图像中相同或者相似特征的检测能力,并且能够应对光照变化、或者图像旋转等影响。

关于角点的具体描述可以有几种:

  • 一阶导数(即灰度的梯度)的局部最大所对应的像素点;
  • 两条及两条以上边缘的交点;
  • 图像中梯度值和梯度方向的变化速率都很高的点;
  • 角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向

上一篇博客介绍了Harris角点检测器,这篇博客将介绍另一个角点检测器:Shi-Tomasi角点检测器。

Shi-Tomasi角点检测器是Harris角点检测器的优化,效果更好;

cv2.goodFeaturesToTrack(),通过Shi-Tomasi方法(或者Harris角点检测)在图像中找到N个最强的角点。并且在跟踪对象方面性能很好。

1. 效果图

原图 VS Harris角点检测器效果如下:

原图 VS Shi-Tomasi角点检测效果图如下:

可以看出Shi-Tomasi确实效果要好一些,所有角点均被成功检测;

2. 源码

# Shi-Tomasi角点检测是Harris角点检测的优化,更准确,会检测出N个最强角点;

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('images/polygon.jpg')

plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.xticks([])
plt.yticks([])
plt.title("origin")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

corners = cv2.goodFeaturesToTrack(gray, 25, 0.01, 10)
corners = np.int0(corners)

for i in corners:
    x, y = i.ravel()
    cv2.circle(img, (x, y), 3, 255, -1)

plt.subplot(1,2,2)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.xticks([])
plt.yticks([])
plt.title("Shi-Tomasi res")
plt.show()

参考 https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_shi_tomasi/py_shi_tomasi.html#shi-tomasi

总结

到此这篇关于OpenCV特征提取与检测之Shi-Tomasi角点检测器的文章就介绍到这了,更多相关OpenCV Shi-Tomasi角点检测器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • OpenCV实现图像角点检测

    历时一个多月,于今天上午终于将项目交上去了,这期间虽很辛苦,但是成长了不少,在此将项目中涉及到的知识点进行整理,本文主要介绍图像的角点检测: 一.代码部分: // Detect_Corners.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "opencv2/opencv.hpp" #include <opencv2/imgproc/imgproc.hpp> #include <iostre

  • OpenCV哈里斯(Harris)角点检测的实现

    环境 pip install opencv-python==3.4.2.16 pip install opencv-contrib-python==3.4.2.16 理论 克里斯·哈里斯(Chris Harris)和迈克·史蒂芬斯(Mike Stephens)在1988年的论文<组合式拐角和边缘检测器>中做了一次尝试找到这些拐角的尝试,所以现在将其称为哈里斯拐角检测器. 函数:cv2.cornerHarris(),cv2.cornerSubPix() 示例代码 import cv2 impor

  • python opencv角点检测连线功能的实现代码

    原始图 角点检测 points = cv2.goodFeaturesToTrack(gray, 100, 0.01, 10) points = np.int0(points).reshape(-1,2) for point in points: x, y = point.ravel() cv2.circle(img, (x, y), 10, (0, 255, 0), -1) 连线 cv2.line(img, (0, y1), (1000, y1), (0, 255, 0), thickness=

  • 基于MFC和OpenCV实现角点检测

    本文实例为大家分享了MFC和OpenCV实现角点检测的具体代码,供大家参考,具体内容如下 // 角点检测 // 根据<基于OpenCV的计算机视觉技术实现> #define max_corners 200; // 限定的最大角点数 IplImage* srcImage = 0; // 待处理的源图像 IplImage* ImageShow = 0; // 存储显示带角点的图像 IplImage* grayImage = 0; // 原始图像转换成的灰阶图像 IplImage* corners1

  • OpenCV特征提取与检测之Shi-Tomasi角点检测器

    前言 角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法,广泛应用于运动检测.图像匹配.视频跟踪.三维重建和目标识别等,也可称为特征点检测. 角点检测算法的基本思想: 使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点. 目前,角点检测算法还不是十

  • OpenCV特征提取与检测之Harris角点检测

    目录 前言 1. 效果图 2. 原理 3. 源码 3.1 Harris角点检测 3.2 精细角点检测 总结 前言 这篇博客将了解什么是特征,角点,哈里斯角点检测(Harris Corner Detection)的概念.并使用cv2.cornerHarris(),cv2.cornerSubPix()实现哈里斯角点检测: 1. 效果图 原图 VS Harris角点检测效果图如下: 原图 VS Harris角点检测效果图如下: 惊细角点效果图如下:Harris角点用红色像素标记,精细角点用绿色像素标记

  • 基于opencv的行人检测(支持图片视频)

    基于方向梯度直方图(HOG)/线性支持向量机(SVM)算法的行人检测方法中存在检测速度慢的问题,如下图所示,对一张400*490像素的图片进行检测要接近800毫秒,所以hog+svm的方法放在视频中进行行人检测时,每秒只能检测1帧图片,1帧/s根本不能达到视频播放的流畅性. 本文采用先从视频每帧的图像中提取出物体的轮廓(也可以对前后两针图片做差,只对有变化的部分进行检测,其目的一样,都是减少运算的面积),再对每个轮廓进行HOG+SVM检测,判断是否为行人.可以大大的缩减HOG+SVM的面积,经实

  • opencv实现棋盘格检测

    本文实例为大家分享了opencv实现棋盘格检测的具体代码,供大家参考,具体内容如下 代码: #include <iostream> #include <vector> #include <opencv2/opencv.hpp>   #include <opencv2/xfeatures2d.hpp> #include <opencv2/optflow/motempl.hpp> using namespace cv;   using namespa

  • 基于openCV实现人脸检测

    openCV的人脸识别主要通过Haar分类器实现,当然,这是在已有训练数据的基础上.openCV安装在 opencv/opencv/sources/data/haarcascades_cuda(或haarcascades)中存在预先训练好的物体检测器(xml格式),包括正脸.侧脸.眼睛.微笑.上半身.下半身.全身等. openCV的的Haar分类器是一个监督分类器,首先对图像进行直方图均衡化并归一化到同样大小,然后标记里面是否包含要监测的物体.它首先由Paul Viola和Michael Jon

  • OpenCV实现人脸检测

    前段日子,写了个人脸检测的小程序,可以检测标记图片.视频.摄像头中的人脸.效果还行吧,用的是opencv提供人脸库.至于具体的人脸检测原理,找资料去啃吧. 环境:VS2013+OPENCV2.4.10+Win8.1 一.基于对话框的MFC 首先,新建一个基于对话框的MFC应用程序,命名为myFaceDetect(取消"安全开发周期(SDL)检查"勾选,我自己习惯取消这个). 放置Button,设置Button的ID和Caption. 图片按钮--ID:IDC_FACEDETECT 视频

  • C++利用opencv实现人脸检测

    小编所有的帖子都是基于unbuntu系统的,当然稍作修改同样试用于windows的,经过小编的绞尽脑汁,把刚刚发的那篇python 实现人脸和眼睛的检测的程序用C++ 实现了,当然,也参考了不少大神的博客,下面我们就一起来看看: Linux系统下安装opencv我就再啰嗦一次,防止有些人没有安装没调试出来喷小编的程序是个坑, sudo apt-get install libcv-dev sudo apt-get install libopencv-dev 看看你的usr/share/opencv

  • python+opencv实现霍夫变换检测直线

    本文实例为大家分享了python+opencv实现霍夫变换检测直线的具体代码,供大家参考,具体内容如下 python+opencv实现高斯平滑滤波 python+opencv实现阈值分割 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意:这里用的函数是HoughLinesP而不是HoughLines,因为HoughLinesP直接给出了直线的断点,在画出线段的时候可以偷懒 代码: # -*- coding: utf-8 -*- import cv2

  • Java+OpenCV实现人脸检测并自动拍照

    java+opencv实现人脸检测,调用笔记本摄像头实时抓拍,人脸会用红色边框标识出来,并且将抓拍的目录存放在src下,图片名称是时间戳. 环境配置:win7 64位,jdk1.8 CameraBasic.java package com.njupt.zhb.test; import java.awt.EventQueue; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; im

  • Python OpenCV调用摄像头检测人脸并截图

    本文实例为大家分享了Python OpenCV调用摄像头检测人脸并截图的具体代码,供大家参考,具体内容如下 注意:需要在python中安装OpenCV库,同时需要下载OpenCV人脸识别模型haarcascade_frontalface_alt.xml,模型可在OpenCV-PCA-KNN-SVM_face_recognition中下载. 使用OpenCV调用摄像头检测人脸并连续截图100张 #-*- coding: utf-8 -*- # import 进openCV的库 import cv2

随机推荐