OpenCV笔记(6)(harris角点检测、背景建模)

一、Harris角点

 

如上图所示,红色框AB都是平面,蓝色框CD都是边缘,而绿色框EF就是角点。

平面:框往X或Y抽移动,变化都很小。

边缘:框沿X或Y轴移动,其中一个变化很小,而另外一个变化比较大。

角点:框沿X或Y轴移动,两个变化都比较大。

见《图像基础》笔记第7页

 

二、背景建模

使用帧差法:

 即用后一帧图像减去前一帧图像,得到运动的物体,但是会出现空洞(前景物体的一个面灰度变化不大,减完得到接近0的数)。

 

使用GMM方法:

# -*- coding:utf-8 -*-
__author__ = 'Leo.Z'

import cv2 as cv

# 打开媒体流
cap = cv.VideoCapture('rtsp://admin:bs12345678@171.221.219.92:554/PSIA/streaming/channels/1201')
# 创建一个形态学kernel
kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))
# 创建MOG2
fgbg = cv.createBackgroundSubtractorMOG2()

while (True):
    # 读取一帧
    ret, frame = cap.read()
    # MOG2运用到每一帧
    fgmask = fgbg.apply(frame)
    # 使用形态学开操作
    fgmask = cv.morphologyEx(fgmask, cv.MORPH_OPEN, kernel)
    # 找轮廓
    contours, hierarchy = cv.findContours(fgmask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

    for c in contours:
        # 计算每个轮廓的周长
        perimeter = cv.arcLength(c, True)
        # 周长大于188的则用方框框起来
        if perimeter > 188:
            # 获取轮廓的外接矩形
            x, y, w, h = cv.boundingRect(c)
            cv.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv.imshow('frame', frame)
    cv.imshow('fgmask', fgmask)
    k = cv.waitKey(10) & 0xff
    if k == 27:
        break
# 释放cap
cap.release()
# 关闭所有窗口
cv.destroyAllWindows()
posted @ 2019-08-18 16:54  风间悠香  阅读(378)  评论(0编辑  收藏  举报