Python OpenCV:使用KNN背景分割器实现特征物体识别

引用自OpenCV 3计算机视觉:Python语言实现 第二版

使用BackgroundSubtractor类中的KNN方法实现背景分割与特征物体检测

BackgroundSubtractor类的另一个基本特征是它可以计算阴影,对于精确度读取视频帧绝对是至关重要的;通过检测阴影,可排除检测图像的阴影区域(采用阈值方式),从而能关注实际特征。

本代码实现的功能是检测固定背景中,新出现的物体,可静可动。
测试环境为Python 3.7 + OpenCV
摄像头使用的是笔记本外接USB摄像头

import cv2  
import numpy as np  

bs = cv2.createBackgroundSubtractorKNN(detectShadows = True)
camera = cv2.VideoCapture(1)

while True:
    ret, frame = camera.read()
    fgmask = bs.apply(frame)
    th = cv2.threshold(fgmask.copy(), 244, 255, cv2.THRESH_BINARY)[1]
    dilated = cv2.dilate(th, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3)), iterations = 2)
    contours, hier = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
        if cv2.contourArea(c) > 1600:
            (x,y,w,h) = cv2.boundingRect(c)
            cv2.rectangle(frame, (x,y), (x+w,y+h), (255,255,0), 2)

    cv2.imshow("mog",fgmask)
    cv2.imshow("thresh",th)
    cv2.imshow("detection",frame)
    if cv2.waitKey(30) & 0xff == 27:
        break

camera.release()
cv2.destroyAllWindows()

运行结果如下图所示:

此时没有物体进入或运动

此时有物体进入
在这里插入图片描述
测试发现检测效果良好,但是检测结果与摄像头的测光结果有很大关系。
如果新加入的物体使整体的测光结果有一定偏差的话,就会导致检测结果产生混乱。

发布了4 篇原创文章 · 获赞 0 · 访问量 175

猜你喜欢

转载自blog.csdn.net/weixin_42886143/article/details/104080252
今日推荐