栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

OpenCV

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OpenCV

前言:更多请看《计算机视觉学习路》

应用场景:

  • 图像搜索,如百度搜图(传入一张图片后找到相似的图片)
  • 拼图游戏,找到一块很容易找到和他临接的另一块
  • 图像拼接,将两张有关联的图拼接到一起

图像特征是具有独特性,易于识别性,比如角点、斑点以及高密度区

角点:灰度梯度的最大值对应的像素、两条线的交点、极值点

Harris角点

cornerHarris(img , blockSize , ksize ,k)

blockSize : 检测窗口大小

ksize : Sobel的卷积核

k : 权重系数,经验值,一般取0.02-0.04

其基本思想为:

下图中红色的点就是Harris角点 

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')

blockSize = 2
ksize = 3
k = 0.04

# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Harris角点检测
dst = cv2.cornerHarris(gray, blockSize, ksize, k)

#角点展示
img[dst > 0.01*dst.max()] = [0,0,255]

cv2.imshow('harris',img)

cv2.waitKey(0)
Shi-Tomasi角点 

该方法是Harris角点检测的改进,因为k是一个经验值,不好设置,所以该方法不需要设置k值

goodFeatursToTrack(img , maxCorners,...)

maxCorners : 角点的最大数,值为0表示无限制

qualityLevel : 小于1的正数,一般在0.01-0.1之间

minDistance : 角之间最小欧式距离,忽略小于此距离的点,距离越大,检测到的角点越少

mask : 感兴趣区域

blockSize : 检测窗口大小

useHarrisDetector : 是否使用Harris算法  true , false  默认false

k : 当使用Harrris时需要设置,默认0.04

效果如下: 

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')

maxCorners = 1000
ql = 0.01
minDistance = 10

# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Harris角点检测
corners = cv2.goodFeaturesToTrack(gray, maxCorners, ql, minDistance)
corners = np.int0(corners)

# 绘制角点
for i in corners:
    x, y = i.ravel()
    cv2.circle(img, (x, y), 3, (255, 0, 0), -1)

cv2.imshow('tomas', img)

cv2.waitKey(0)
SIFT

Scale-Invariant Feature Transform  与缩放无关的特征转换

提出:Harris角点检测,当图像缩放后,原来的角点可能会消失如下图所示。SIFT就是为了解决这一问题。

检测的步骤

1.创建SIFT对象  sift = cv2.SIFT_create()

2.进行检测  kp = sift.detect(img , mask) # mask感兴趣区域,默认None

3.绘制关键点  drawKeypoints(gray , kp , img) # img是要绘制的图片

  

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')
# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT_create()
kp = sift.detect(gray)
cv2.drawKeypoints(gray,kp,img)

cv2.imshow('SIFT', img)

cv2.waitKey(0)
计算关键点和描述子

关键点:位置、大小、方向

关键点描述子:记录了关键点周围对其有贡献的像素点的一组向量值,不受仿射变换、光照变换等影响。

同时计算关键点kp和描述子des:

kp , des = sift.detectAndCompute(img,mask...)

mask : 指明对img的哪个区域进行计算

其作用是进行特征匹配

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')
# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT_create()
# 计算关键点和描述子
kp,des = sift.detectAndCompute(gray,None)
print(des)

cv2.drawKeypoints(gray,kp,img)

cv2.imshow('SIFT', img)

cv2.waitKey(0)
SURF

Speeded-Up Robust Features

提出:SIFT最大的问题是速度慢,所以有了该算法 

1.创建对象 surf = cv2.xfeatures2d.SURF_create()

2.计算关键点和描述子  kp,des = surf.detectAndCompute(img , mask)

检测结果同SIFT,检测到的角点会少一点。

ORB

Oriented FAST and Rotated BRIEF

优势:可以做到实时检测

orb = cv2.ORB_create()

kp,des = orb.detectAndCompute(gray,None)

可以看到检测到的特征点非常少,这是因为实时性提高了,计算量减少了,只留下关键点 

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')
# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

orb = cv2.ORB_create()
# 计算关键点和描述子
kp,des = orb.detectAndCompute(gray,None)
print(des)

cv2.drawKeypoints(gray,kp,img)

cv2.imshow('ORB', img)

cv2.waitKey(0)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/948090.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号