机器视觉三四部分代码实现

机器视觉三四部分代码实现

因为版权的问题:SIFT和它的改进算法SURF算法在2020年之后版权到期,要想通过opencv调用要使用之前指定版本的opencv

下面我们给出opencv的指定版本安装方式。我们要下载老版本的opencv库并下载其拓展库。

pip install numpy==1.12.0  
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16

角点检测

# Harris角点检测

'''
API说明
cornerHarris(img, dst, blockSize, ksize, k)
blockSize:检测窗口大小
ksize:Sobel的卷积核
k:权重系数,经验值,一般取0.02~0.04之间
'''


import cv2
import numpy as np

blocksize =2
ksize = 3
k = 0.04
img = cv2.imread('test.jpeg')
# 转为灰度图:
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 角点检测
dst =cv2.cornerHarris(gray,blocksize,ksize,k)
#角点显示
img[dst>0.01*dst.max()] = [0,0,255]

cv2.imshow('harris',img)
cv2.waitKey(0)

在这里插入图片描述

SIFT算法

'''
API说明
创建SFT对象
进行检测,kp = sift.detect(img,..)
绘制关键点,drawKeypoints(gray,kp,img)
pip install opencv-contrib-python==3.4.2.17
'''
import cv2
import numpy as np
img = cv2.imread('test.jpeg')
# 新版的使用方式
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
# sift = cv2.SIFT_create()
# kp = sift.detect(gray, None)
kp,des=sift.detectAndCompute(img,None)
print(des[0])
cv2.drawKeypoints(gray, kp, img)
cv2.imshow('text',img)
cv2.waitKey(0)

在这里插入图片描述

SURF算法

# Speeded-Up Robust Features SIFT最大的问题是速度慢,因此才有SURF
'''
surf =cv2.SURF_create()
其他的就是在之前的基础上更改创建对象即可
'''

import cv2
import numpy
img = cv2.imread('test.jpeg')
gray = cv2.cvtColor(img,cv2.COLOR_BGRA2GRAY)
surf =cv2.xfeatures2d.SURF_create()

kp = surf.detect(gray, None)

cv2.drawKeypoints(gray, kp, img)
cv2.imshow('text',img)
cv2.waitKey(0)

在这里插入图片描述

背景建模

# gmm背景建模
import numpy as np
import cv2

#经典的测试视频
cap = cv2.VideoCapture('test.avi')
#形态学操作需要使用
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
#创建混合高斯模型用于背景建模
fgbg = cv2.createBackgroundSubtractorMOG2()

while(True):
    ret, frame = cap.read() # 成功读取帧ret为True
    fgmask = fgbg.apply(frame) # MOG2算法)来学习背景,并在后续的帧中识别出前景对象将背景减除算法应用于给定的帧图像 frame
    #形态学开运算去噪点
    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
    # cv2.imshow('mask1',fgmask)
    # cv2.waitKey(15)
    #寻找视频中的轮廓
    # 检测前景掩模 fgmask 中的所有轮廓。这个函数用于在二值图像中查找轮廓,并将它们作为一组点返回,这些点定义了轮廓的形状 cv2.RETR_EXTERNAL 是一个标志,指定只检测最外层的轮廓
    im, contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # contours 是一个Python列表,包含了检测到的轮廓。每个轮廓都是一个点的列表,每个点是一个 (x, y) 坐标对
    for c in contours:
        #计算各轮廓的周长
        perimeter = cv2.arcLength(c,True)
        if perimeter > 188:
            #找到一个直矩形(不会旋转)
            x,y,w,h = cv2.boundingRect(c)
            #画出这个矩形
            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)

    cv2.imshow('frame',frame)
    cv2.imshow('fgmask', fgmask)
    k = cv2.waitKey(150) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

在这里插入图片描述

光流估计

# lk光流 用于跟踪视频中的特征点(角点)的运动
import numpy as np
import cv2

cap = cv2.VideoCapture('test.avi')

# 角点检测所需参数
feature_params = dict( maxCorners = 100, # 最大角点数量
                       qualityLevel = 0.3, # 阈值
                       minDistance = 7) # 最小距离

# lucas kanade参数
lk_params = dict( winSize  = (15,15), # 光流的窗口大小
                  maxLevel = 2) # 图像金字塔中进行光流计算的最大层级

# 随机颜色条
color = np.random.randint(0,255,(100,3))

# 拿到第一帧图像
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
# 返回所有检测特征点,需要输入图像,角点最大数量(效率),品质因子(特征值越大的越好,来筛选)
# 距离相当于这区间有比这个角点强的,就不要这个弱的了
p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params) # 第一帧的角点p0要进行追踪

# 创建一个mask
mask = np.zeros_like(old_frame)

while(True):
    ret,frame = cap.read()
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 核心实际调用的一个函数
    # 需要传入前一帧和当前图像以及前一帧检测到的角点 old_gray 和 frame_gray 是两个连续帧的灰度图像
    # p1 是在frame_gray图像中找到的对应于p0的特征点。这些点表示了p0中点在下一帧中的位置。
    # t 是一个状态数组,其中每个元素是一个布尔值,表示对应的特征点是否成功跟踪。如果st[i]为1,则表示第i个点被成功跟踪
    p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)

    # st=1表示(找确定跟踪的角点)
    good_new = p1[st==1]
    good_old = p0[st==1]

    # 绘制轨迹
    for i,(new,old) in enumerate(zip(good_new,good_old)):
        a,b = new.ravel()
        c,d = old.ravel()
        mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
        frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1)
    img = cv2.add(frame,mask)

    cv2.imshow('frame',img)
    k = cv2.waitKey(150) & 0xff
    if k == 27:
        break

    # 更新
    old_gray = frame_gray.copy()
    p0 = good_new.reshape(-1,1,2)

cv2.destroyAllWindows()
cap.release()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46167190/article/details/143088799