model11.py-20170919

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 17 15:16:51 2017

@author: vicky
"""
import numpy as np
import cv2

cap = cv2.VideoCapture('/Users/vicky/Desktop/附件2-典型视频/有晃动/cars6/input.mov')
#创建一个3*3的椭圆核
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))#形态学运算,膨胀
#创建BackgroundSubtractorMOG2
fgbg1 = cv2.createBackgroundSubtractorMOG2()#视频的背景分割,Foreground Segmentation Algorithm
fgbg2 = cv2.createBackgroundSubtractorKNN()
#fgbg3 = cv2.bgsegm.createBackgroundSubtractorMOG()
#fgbg4 = cv2.createBackgroundSubtractorGMG()  
# Define the codec and create VideoWriter object
#fps = cap.get(cv2.CAP_PROP_FPS)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
#out = cv2.VideoWriter('output.avi', -1, fps, size)
fourcc=cv2.VideoWriter_fourcc('X','V','I','D')
out = cv2.VideoWriter('out.avi',fourcc,20.0,size)

Z=[]

while(1):
    ret1, frame1 = cap.read(0)
    ret2, frame2 = cap.read(0)
    if ret1 == True:
        #img_new = frame
        fgmask1 = fgbg1.apply(frame1)
        fgmask2 = fgbg2.apply(frame2)
        # 形态学开运算去噪点
        fgmask1 = cv2.morphologyEx(fgmask1, cv2.MORPH_OPEN, kernel)
        fgmask2 = cv2.morphologyEx(fgmask2, cv2.MORPH_OPEN, kernel)
        #平滑方式去除噪声,
        blured1 = cv2.bilateralFilter(fgmask1, 10, 5, 5)
        blured2 = cv2.GaussianBlur(fgmask1, (3, 3), 0)
        blured3 = cv2.blur(fgmask1, (5, 5))
        blured4 = cv2.medianBlur(fgmask1, 5)
        fgmask = blured2
        # 闭运算去噪点
        fgmask1 = closing = cv2.morphologyEx(fgmask1, cv2.MORPH_CLOSE, kernel)
        fgmask2 = closing = cv2.morphologyEx(fgmask2, cv2.MORPH_CLOSE, kernel)
        #寻找视频中的轮廓
        im1, contours1, hierarchy1 = cv2.findContours(fgmask1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        for c in contours1:
            #计算各轮廓的周长
            perimeter = cv2.arcLength(c,True)
            if perimeter > 50:
                
                # CV2.moments會傳回一系列的moments值,我們只要知道中點X, Y的取得方式是如下進行即可。
                M = cv2.moments(c)
                cX = int(M['m10'] / M['m00'])
                cY = int(M['m01'] / M['m00'])
                # 在中心點畫上黃色實心圓
                cv2.circle(frame1, (cX, cY), 10, (1, 227, 254), -1)
                
                #找到一个直矩形(不会旋转)
                x,y,w,h = cv2.boundingRect(c)
                #画出这个矩形
                cv2.rectangle(frame1,(x,y),(x+w,y+h),(0,255,0),2)
                
                # 用红色表示有旋转角度的矩形框架
                rect = cv2.minAreaRect(c)
                box = cv2.boxPoints(rect)
                box = np.int0(box)
                cv2.drawContours(frame1, [box], 0, (0, 0, 255), 2)
                #cv2.imwrite('contours.png', frame)
                
        im2, contours2, hierarchy2 = cv2.findContours(fgmask2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        for c in contours2:
            #计算各轮廓的周长
            perimeter = cv2.arcLength(c,True)
            Z.append(perimeter)
            if perimeter > 50:
#                # CV2.moments會傳回一系列的moments值,我們只要知道中點X, Y的取得方式是如下進行即可。
#                M = cv2.moments(c)
#                cX = int(M['m10'] / M['m00'])
#                cY = int(M['m01'] / M['m00'])
#                # 在中心點畫上黃色實心圓
#                cv2.circle(frame2, (cX, cY), 10, (1, 227, 254), -1)
#                
                #找到一个直矩形(不会旋转)
                x,y,w,h = cv2.boundingRect(c)
                #画出这个矩形
                cv2.rectangle(frame2,(x,y),(x+w,y+h),(0,255,0),2)
                
                # 用红色表示有旋转角度的矩形框架
                rect = cv2.minAreaRect(c)
                box = cv2.boxPoints(rect)
                box = np.int0(box)
                cv2.drawContours(frame2, [box], 0, (0, 0, 255), 2)
         
        out.write(fgmask1)
        #out.write(fgmask2)
        cv2.imshow('frame1',frame1)
        cv2.imshow('frame2',frame2)
        cv2.imshow('fgmask1',fgmask1)
        cv2.imshow('fgmask2',fgmask2)
    else:
        break

    if cv2.waitKey(25) & 0xFF == ord('q'):
        break
    
out.release()
cap.release()
cv2.destroyAllWindows()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值