110 lines
3.4 KiB
Python
110 lines
3.4 KiB
Python
|
#!/usr/bin/python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
import numpy as np
|
||
|
import cv2
|
||
|
import socket
|
||
|
import io
|
||
|
import sys
|
||
|
from PIL import Image
|
||
|
from multiprocessing import Process
|
||
|
from Command import COMMAND as cmd
|
||
|
|
||
|
class VideoStreaming:
|
||
|
def __init__(self):
|
||
|
self.face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')
|
||
|
self.video_Flag=True
|
||
|
self.connect_Flag=False
|
||
|
self.face_x=0
|
||
|
self.face_y=0
|
||
|
def StartTcpClient(self,IP):
|
||
|
self.client_socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
|
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
|
print 'StartTcpClient'
|
||
|
def StopTcpcClient(self):
|
||
|
try:
|
||
|
self.connection.close()
|
||
|
self.client_socket.close()
|
||
|
self.client_socket1.close()
|
||
|
except:
|
||
|
pass
|
||
|
|
||
|
def IsValidImage4Bytes(self,buf):
|
||
|
bValid = True
|
||
|
if buf[6:10] in (b'JFIF', b'Exif'):
|
||
|
if not buf.rstrip(b'\0\r\n').endswith(b'\xff\xd9'):
|
||
|
bValid = False
|
||
|
else:
|
||
|
try:
|
||
|
Image.open(io.BytesIO(buf)).verify()
|
||
|
except:
|
||
|
bValid = False
|
||
|
|
||
|
return bValid
|
||
|
|
||
|
def face_detect(self,img):
|
||
|
if sys.platform.startswith('win'):
|
||
|
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
|
||
|
faces = self.face_cascade.detectMultiScale(gray,1.3,5)
|
||
|
if len(faces)>0 :
|
||
|
for (x,y,w,h) in faces:
|
||
|
self.face_x=float(x+w/2.0)
|
||
|
self.face_y=float(y+h/2.0)
|
||
|
img = cv2.circle(img, (x+w/2,y+h/2), (w+h)/4, (0, 255, 0), 2)
|
||
|
else:
|
||
|
self.face_x=0
|
||
|
self.face_y=0
|
||
|
|
||
|
else:
|
||
|
pass
|
||
|
cv2.imwrite('video.jpg', img)
|
||
|
|
||
|
def streaming(self,ip):
|
||
|
try:
|
||
|
stream_bytes = b' '
|
||
|
self.client_socket.connect((ip, 8000))
|
||
|
self.connection = self.client_socket.makefile('wb')
|
||
|
while True:
|
||
|
try:
|
||
|
stream_bytes += self.connection.read(1024)
|
||
|
first = stream_bytes.find(b'\xff\xd8')
|
||
|
last = stream_bytes.find(b'\xff\xd9')
|
||
|
if first != -1 and last != -1 :
|
||
|
jpg = stream_bytes[first:last + 2]
|
||
|
stream_bytes = stream_bytes[last + 2:]
|
||
|
if self.IsValidImage4Bytes(jpg):
|
||
|
image = cv2.imdecode(np.frombuffer(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
|
||
|
if self.video_Flag:
|
||
|
self.face_detect(image)
|
||
|
except:
|
||
|
break
|
||
|
except:
|
||
|
pass
|
||
|
|
||
|
def sendData(self,s):
|
||
|
if self.connect_Flag:
|
||
|
self.client_socket1.send(s)
|
||
|
else:
|
||
|
pass
|
||
|
|
||
|
def recvData(self):
|
||
|
data=0
|
||
|
try:
|
||
|
data=self.client_socket1.recv(1024)
|
||
|
except:
|
||
|
pass
|
||
|
return data
|
||
|
|
||
|
def socket1_connect(self,ip):
|
||
|
try:
|
||
|
self.client_socket1.connect((ip, 5000))
|
||
|
self.connect_Flag=True
|
||
|
print "Connecttion Successful !"
|
||
|
except Exception, e:
|
||
|
print "Connect to server Faild!: Server IP is right? Server is opend?", e
|
||
|
self.connect_Flag=False
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
a=VideoStreaming()
|
||
|
pass
|
||
|
|