基于python的视频监控系统_Python远程视频监控程序的实例代码
老板由于事務繁忙無法經常親臨教研室,于是讓我搞個監控系統,讓他在辦公室就能看到教研室來了多少人。o(>﹏<)o|||
最初我的想法是直接去網上下個軟件,可是找來找去不是有毒就是收費,無奈技術不到家無法破解,只得另尋他法。
正當沒有辦法的時候,我看到一篇博文一個基于python的高速視頻傳輸程序 ,看完茅塞頓開,覺得完全可以自己寫一個,在此感謝作者詹姆斯。
這個程序包括一個服務器和一個客戶端。需要的庫有 VideoCapture 和 pygame,一個用來得到攝像頭的視頻,一個用來顯示。Python庫可以點這里下載:Python Extension Packages。進去后ctrl+F找到相應的庫,然后選擇相應的版本即可,這里還有很多其他的庫可提供下載。
我想到的解決方案是,在教研室開一臺電腦,接一個USB攝像頭,然后開啟一個服務器程序,等待著老板使用客戶端連接,由于是實時視頻傳輸,使用UDP協議。(主要傳輸部分采用詹姆斯的代碼)。
服務器端代碼如下:
# -*- coding: UTF-8 -*-
import socket
import time
import traceback
from VideoCapture import Device
import threading
# 全局變量
is_sending = False
cli_address = ('', 0)
# 主機地址和端口
host = ''
port = 10218
# 初始化UDP socket
ser_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ser_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
ser_socket.bind((host, port))
# 接收線程類,用于接收客戶端發送的消息
class UdpReceiver(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.thread_stop = False
def run(self):
while not self.thread_stop:
# 聲明全局變量,接收消息后更改
global cli_address
global is_sending
try:
message, address = ser_socket.recvfrom(2048)
except:
traceback.print_exc()
continue
# print message,cli_address
cli_address = address
if message == 'startCam':
print 'start camera',
is_sending = True
ser_socket.sendto('startRcv', cli_address)
if message == 'quitCam':
is_sending = False
print 'quit camera',
def stop(self):
self.thread_stop = True
# 創建接收線程
receiveThread = UdpReceiver()
receiveThread.setDaemon(True) # 該選項設置后使得主線程退出后子線程同時退出
receiveThread.start()
# 初始化攝像頭
cam = Device()
cam.setResolution(320,240)
# 主線程循環,發送視頻數據
while 1:
if is_sending:
img = cam.getImage().resize((160,120))
data = img.tostring()
ser_socket.sendto(data, cli_address)
time.sleep(0.05)
else:
time.sleep(1)
receiveThread.stop()
ser_socket.close()
服務器啟動一個子線程,來監聽客戶端發送的消息。當有消息時,將is_sending改為True,則服務器向該客戶端發送視頻數據。具體信息可以看代碼注釋。
客戶端代碼如下:
# -*- coding: UTF-8 -*-
import socket, time
import pygame
from pygame.locals import *
from sys import exit
# 服務器地址,初始化socket
ser_address = ('localhost', 10218)
cli_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 設置超時
cli_socket.settimeout(5)
# 向服務器發送消息,并判斷接收時是否超時,若超時則重發
while 1:
cli_socket.sendto('startCam', ser_address)
try:
message, address = cli_socket.recvfrom(2048)
if message == 'startRcv':
print message
break
except socket.timeout:
continue
# 此句無用。。防止窗口初始化后等待數據
cli_socket.recvfrom(65536)
# 初始化視頻窗口
pygame.init()
screen = pygame.display.set_mode((640,480))
pygame.display.set_caption('Web Camera')
pygame.display.flip()
# 設置時間,可以用來控制幀率
clock = pygame.time.Clock()
# 主循環,顯示視頻信息
while 1:
try:
data, address = cli_socket.recvfrom(65536)
except socket.timeout:
continue
camshot = pygame.image.frombuffer(data, (160,120), 'RGB')
camshot = pygame.transform.scale(camshot, (640, 480))
for event in pygame.event.get():
if event.type == pygame.QUIT:
cli_socket.sendto('quitCam', ser_address)
cli_socket.close()
pygame.quit()
exit()
screen.blit(camshot, (0,0))
pygame.display.update()
clock.tick(20)
總結
以上是生活随笔為你收集整理的基于python的视频监控系统_Python远程视频监控程序的实例代码的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: vue子组件获取父组件数据_在vue.j
- 下一篇: visual studio code p
