一、OpenCV接口调用示意

介绍了OpenCV3中提取图像角点特征的函数:

 1 # coding=utf-8
 2 import cv2
 3 import numpy as np
 4
 5
 6 '''Harris算法角点特征提取'''
 7
 8 img = cv2.imread('chess_board.png')
 9 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
10 gray = np.float32(gray)
11
12 # {标记点大小,敏感度(3~31,越小越敏感)}
13 # OpenCV函数cv2.cornerHarris() 有四个参数 其作用分别为 :
14 #img - Input image, it should be grayscale and float32 type.
15 #blockSize - It is the size of neighbourhood considered for corner detection
16 #ksize - Aperture parameter of Sobel derivative used.
17 #k - Harris detector free parameter in the equation,在0.04 到0.05之间
18 dst = cv2.cornerHarris(gray,2,23,0.04)
19 img[dst>0.01 * dst.max()] = [0,0,255]
20
21 cv2.imshow('corners',img)
22 cv2.waitKey()
23 cv2.destroyAllWindows()

dst = cv2.cornerHarris(gray,2,23,0.04)中第3个参数(23)调整对结果影响如下:

取值为3时:

取值为23时:

二、使用Python实现harris胶垫检测

计算机视觉课后作业,因为已经提交了一段时间了,之前也注意到网上很少有python版本的harris角点检测代码,所以开源出来,

# Author : hellcat
# Time   : 18-3-22"""
import os
os.environ["CUDA_VISIBLE_DEVICES"]="-1"import numpy as np
np.set_printoptions(threshold=np.inf)import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
"""import numpy as np
from PIL import Image
from skimage import filters
from datetime import datetime
import matplotlib.pyplot as pltIMAGE_PATH = '1653033843.jpg'     # 图片路径
WITH_NMS = False                  # 是否非极大值抑制,True/False
k = 0.04                          # 响应函数参数k
threshold = 0.01                  # 界定阈值img = Image.open(IMAGE_PATH)
img_gray = img.convert('L')
img_num = np.pad(np.asarray(img_gray, dtype=np.float32), ((1, 1), (1, 1)), 'constant')
h, w = img_num.shape  # padding之后的图像尺寸# 计算Ix,Iy
grad = np.empty([h, w, 2], dtype=np.float)
grad[:, 1:-1, 0] = img_num[:, 2:] - img_num[:, :-2]  # Ix
grad[1:-1, :, 1] = img_num[2:, :] - img_num[:-2, :]  # Iy# 计算Ixx,Iyy,Ixy
m = np.empty([h, w, 3], dtype=np.float)
# m[:, :, 0] = grad[:, :, 0]**2
# m[:, :, 1] = grad[:, :, 0]**2
# m[:, :, 2] = grad[:, :, 0]*grad[:, :, 1]
m[:, :, 0] = filters.gaussian(grad[:, :, 0]**2, sigma=2)  # Ixx
m[:, :, 1] = filters.gaussian(grad[:, :, 1]**2, sigma=2)  # Iyy
m[:, :, 2] = filters.gaussian(grad[:, :, 0]*grad[:, :, 1], sigma=2)  # Ixy
m = [np.array([[m[i, j, 0], m[i, j, 2]],[m[i, j, 2], m[i, j, 1]]]) for i in range(h) for j in range(w)]# 记录一下R计算时耗
start = datetime.now()
# 0:00:42.123384 迭代器策略:用时间换空间
# R = np.array([d-k*t**2 for d, t in zip(map(np.linalg.det, m), map(np.trace, m))])
# 0:00:35.846864
D, T = list(map(np.linalg.det, m)), list(map(np.trace, m))
R = np.array([d-k*t**2 for d, t in zip(D, T)])
end = datetime.now()
print(end-start)R_max = np.max(R)
R = R.reshape(h, w)# 标注角点
record = np.zeros_like(R, dtype=np.int)
img_row = np.pad(np.asarray(img, dtype=np.float32), ((1, 1), (1, 1), (0, 0)), 'constant')
for i in range(1, h-2):for j in range(1, w-2):if WITH_NMS:if R[i, j] > R_max*threshold and R[i, j] == np.max(R[i-1:i+2, j-1:j+2]):record[i, j] = 255img_row[i, j] = [255, 255, 255]else:if R[i, j] > R_max*0.01:record[i, j] = 255img_row[i, j] = [255, 255, 255]
# record[R > 0.01*R_max] = 255
# img_row[R > 0.01*R_max] = [255, 255, 255]# 图像展示与保存
res = Image.fromarray(np.uint8(record[1:-1, 1:-1]))
img_row = Image.fromarray(np.uint8(img_row[1:-1, 1:-1]))plt.figure()
plt.subplot(1, 2, 1)
plt.imshow(res)
plt.subplot(1, 2, 2)
plt.imshow(img_row)
if WITH_NMS:plt.savefig('角点检测_NMS.jpg')res.save('角点检测_NMS_1.png')img_row.save('角点检测_NMS_2.png')
else:plt.savefig('角点检测_no_NMS.jpg')res.save('角点检测_no_NMS_1.png')img_row.save('角点检测_no_NMS_2.png')

实际上在计算Ixx,Ixy,Iyy时要进行高斯滤波,理论推导中都采用了最简单的权重(全部为1),这点注意,使用全1权重啥也检测不出来。

不进行非极大值抑制结果:

进行非极大值抑制结果(实际上检测出来的点很多,因为分辨率看不清):

『OpenCV3』Harris角点特征_API调用及python手动实现相关推荐

  1. opencv3/C++ Harris角点、Shi-Tomasi角点亚像素角点

    角点检测在图像匹配.目标识别.目标跟踪.运动估计与三维重建等CV领域起着非常重要的作用. 角点定义 关于角点的定义有以下几种: 1.角点是两条及两条以上的边缘的交点: 2.角点处的一阶导数最大,二阶导 ...

  2. 『OpenCV3』滤波器实现及使用滤波器降噪

    一.滤波器实现 我们实现这样一个基于拉普拉斯算子的滤波器核心,并使用它进行滤波,这可以做到锐化图像的效果, 0 -1 0 -1 5 -1 0 -1 0 首先我们完全手动的进行滤波,依赖指针操作, vo ...

  3. Harris角点特征提取和角点特征匹配(2)

    Harris角点特征提取和特征匹配(后半部分) 前半部分点击以下链接: https://blog.csdn.net/QWER306306/article/details/123510826 本文采用H ...

  4. Harris角点检测和Shi-Tomasi角点检测

    文章目录 什么是角点? Harris角点的基本思想 Harris角点特征的数学表达 Harris角点的性质 Harris算法具体步骤 Tshi-Tomasi角点检测和Harris的区别 什么是角点? ...

  5. android openCV检测图像的基本特征,包括Canny边缘检测、Harris角点检测、霍夫直线检测-基于Android studio

    实现平台:windows下的Android studio1.4 依赖库:openCV3.1.0 程序安装平台:Android6.0 实现的功能:从手机中选择一张图片,检测图片的基本特征,通过menu菜 ...

  6. 《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测

    第10章 角点检测 10.1 Harris角点检测 10.1.1 角点 1.图像特征类型: (1)边缘 (2)角点(感兴趣点) (3)斑点(感兴趣区域) 2.角点定义: (1) 一阶导数(灰度的梯度) ...

  7. OpenCV之feature2d 模块. 2D特征框架(1)Harris 角点检测子 Shi-Tomasi角点检测子 定制化创建角点检测子 亚像素级的角点检测 特征点检测

    Harris 角点检测子 目标 本教程中我们将涉及: 有哪些特征?它们有什么用? 使用函数 cornerHarris 通过 Harris-Stephens方法检测角点. 理论 有哪些特征? 在计算机视 ...

  8. 特征点提取之Harris角点提取法

    1. 特征点提取的意义 2.角点 3. Harris角点检测的基本原理 4.Harris角点检测算法的步骤 5.Harris角点提取算法设计 <span style="font-siz ...

  9. OpenCV-图像特征harris角点检测/SIFT函数/特征匹配-05

    图像特征-harris角点检测 基本原理 R>0 角点 R≈0 平坦区域 R<0 边界 总结一下Harris算法流程 获取点数据后,计算Ix 和 Iy 整合矩阵,求特征值 比较特征值大小 ...

  10. 图像特征提取与描述_角点特征01:Harris算法+Shi-Tomas算法

    1 Harris角点检测 1.1 原理 Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化,如下图所示: 将上述思想转换为数学形式,即 ...

最新文章

  1. mysql show命令用不了_MySQL show命令的用法 | 很文博客
  2. 150kHz无线导航信号接收板调试-Ver2
  3. Rsync 基本安装及同步(一)
  4. 巧用 PHP 数组函数
  5. 为什么喝酒有的人会脸红,有的人会脸发白
  6. 《剑指offer》数据流中的中位数
  7. Eclipse程序员要掌握的常用快捷键
  8. 手把手教你数据不足时如何做深度学习NLP
  9. 集成学习—决策树(CART)
  10. win10下Redis安装、启动教程
  11. 怎样才能容易更换DB
  12. python collections模块(队列)
  13. 深入JavaScript之JS引擎如何执行JS代码
  14. 天邑TY1608卡刷包晶晨S905L3B支持RTL8822CS、MT7668、MT7661
  15. xxx.com和www.xxx.com的区别
  16. 基于matlab的锁相环频率合成器,基于MATLAB锁相环.ppt
  17. WIN API编程的详细介绍
  18. CSS最详细的基础教程
  19. ipad好用的思维导图软件有哪些
  20. input调起ios摄像头拍照旋转问题解决思路

热门文章

  1. 小程序 switch 自定义_微信小程序自定义组件问题一:获取组件DOM元素
  2. docker-compose搭建EFK,继上篇使用filebeat+es对日志文件的过滤
  3. python分类器鸢尾花怎么写_机器学习之路: python k近邻分类器 鸢尾花分类预测
  4. MAC编译OpenJDK8(含202-242)的Xcode版本问题
  5. OFFICE软件有哪三大语言功能?
  6. 为解决WINDOWS JRE启动外壳,找了好几个方案
  7. 在项目中经历生死的系统,才会成熟
  8. ImportError: No module named tensorrt
  9. 雄伟到惊世骇俗的黄羊山超级相控阵雷达
  10. 管理感悟:正确认识自己的工作