Пример #1
0
def test_multiserver_mode():
	"""
	Testing NetGear's Multi-Server Mode with three unique servers
	"""
	try:
		#open network stream
		stream = VideoGear(source=return_testvideo_path()).start()

		#define and activate Multi-Server Mode
		options = {'multiserver_mode': True}

		#define a single client
		client = NetGear(port = ['5556', '5557', '5558'], pattern = 1, receive_mode = True, logging = True, **options)
		#define client-end dict to save frames inaccordance with unique port 
		client_frame_dict = {}

		#define three unique server
		server_1 = NetGear(pattern = 1, port = '5556', logging = True, **options) #at port `5556`
		server_2 = NetGear(pattern = 1, port = '5557', logging = True, **options) #at port `5557`
		server_3 = NetGear(pattern = 1, port = '5558', logging = True, **options) #at port `5558`

		#generate a random input frame
		frame_server = None
		i = 0
		while (i < random.randint(10, 100)):
			frame_server = stream.read()
			i+=1
		#check if input frame is valid
		assert not(frame_server is None)

		#send frame from Server-1 to client and save it in dict
		server_1.send(frame_server)
		unique_address, frame = client.recv()
		client_frame_dict[unique_address] = frame
		#send frame from Server-2 to client and save it in dict
		server_2.send(frame_server)
		unique_address, frame = client.recv()
		client_frame_dict[unique_address] = frame
		#send frame from Server-3 to client and save it in dict
		server_3.send(frame_server)
		unique_address, frame = client.recv()
		client_frame_dict[unique_address] = frame
		
		#clean all resources
		stream.stop()
		server_1.close()
		server_2.close()
		server_3.close()
		client.close()

		#check if recieved frames from each unique server exactly matches input frame
		for key in client_frame_dict.keys():
			assert np.array_equal(frame_server, client_frame_dict[key])

	except Exception as e:
		if isinstance(e, (ZMQError, ValueError)):
			logger.error(traceback.print_tb(e.__traceback__))
		else:
			pytest.fail(str(e)) 
Пример #2
0
def test_bidirectional_mode(pattern, target_data, options):
    """
    Testing NetGear's Bidirectional Mode with different data-types
    """
    # initialize
    stream = None
    server = None
    client = None
    try:
        logger.debug("Given Input Data: {}".format(target_data))
        # open stream
        stream = VideoGear(source=return_testvideo_path()).start()
        # define params
        client = NetGear(pattern=pattern, receive_mode=True, **options)
        server = NetGear(pattern=pattern, **options)
        # get frame from stream
        frame_server = stream.read()
        assert not (frame_server is None)
        # check if target data is numpy ndarray
        if isinstance(target_data, np.ndarray):
            # sent frame and data from server to client
            server.send(target_data, message=target_data)
            # client receives the data and frame and send its data
            server_data, frame_client = client.recv(return_data=target_data)
            # server receives the data and cycle continues
            client_data = server.send(target_data, message=target_data)
            # logger.debug data received at client-end and server-end
            logger.debug("Data received at Server-end: {}".format(frame_client))
            logger.debug("Data received at Client-end: {}".format(client_data))
            assert np.array_equal(client_data, frame_client)
        else:
            # sent frame and data from server to client
            server.send(frame_server, message=target_data)
            # client receives the data and frame and send its data
            server_data, frame_client = client.recv(return_data=target_data)
            # server receives the data and cycle continues
            client_data = server.send(frame_server, message=target_data)
            # check if received frame exactly matches input frame
            assert np.array_equal(frame_server, frame_client)
            # logger.debug data received at client-end and server-end
            logger.debug("Data received at Server-end: {}".format(server_data))
            logger.debug("Data received at Client-end: {}".format(client_data))
            assert client_data == server_data
    except Exception as e:
        if isinstance(e, (ZMQError, ValueError)):
            logger.exception(str(e))
        else:
            pytest.fail(str(e))
    finally:
        # clean resources
        if not (stream is None):
            stream.stop()
        if not (server is None):
            server.close()
        if not (client is None):
            client.close()
Пример #3
0
def test_playback(address, port):
    """
    Tests NetGear Bare-minimum network playback capabilities
    """
    stream = None
    server = None
    client = None
    try:
        # open stream
        stream = VideoGear(source=return_testvideo_path()).start()
        # open server and client with default params
        client = NetGear(address=address, port=port, receive_mode=True)
        server = NetGear(address=address, port=port)
        # playback
        while True:
            frame_server = stream.read()
            if frame_server is None:
                break
            server.send(frame_server)  # send
            frame_client = client.recv()  # recv
    except Exception as e:
        if isinstance(e, (ZMQError, ValueError)) or address == "www.idk.com":
            logger.exception(str(e))
        else:
            pytest.fail(str(e))
    finally:
        # clean resources
        if not (stream is None):
            stream.stop()
        if not (server is None):
            server.close()
        if not (client is None):
            client.close()
Пример #4
0
def test_patterns(pattern):
	"""
	Testing NetGear different messaging patterns
	"""
	#open stream
	try:
		stream = VideoGear(source=return_testvideo_path()).start()
		
		#define parameters
		options = {'flag' : 0, 'copy' : True, 'track' : False}
		client = NetGear(pattern = pattern, receive_mode = True, logging = True, **options)
		server = NetGear(pattern = pattern, logging = True, **options)
		#initialize 
		frame_server = None
		#select random input frame from stream
		i = 0
		while (i < random.randint(10, 100)):
			frame_server = stream.read()
			i+=1
		#check if input frame is valid
		assert not(frame_server is None)
		#send frame over network
		server.send(frame_server)
		frame_client = client.recv()
		#clean resources
		stream.stop()
		server.close()
		client.close()
		#check if recieved frame exactly matches input frame
		assert np.array_equal(frame_server, frame_client)
	except Exception as e:
		if isinstance(e, (ZMQError, ValueError)):
			logger.error(traceback.print_tb(e.__traceback__))
		else:
			pytest.fail(str(e))
Пример #5
0
def test_playback():
	"""
	Tests NetGear Bare-minimum network playback capabilities
	"""
	try:
		#open stream
		stream = VideoGear(source=return_testvideo_path()).start()
		#open server and client with default params
		client = NetGear(receive_mode = True)
		server = NetGear()
		#playback
		while True:
			frame_server = stream.read()
			if frame_server is None: break
			server.send(frame_server) #send
			frame_client = client.recv() #recv
		#clean resources
		stream.stop()
		server.close()
		client.close()
	except Exception as e:
		if isinstance(e, (ZMQError, ValueError)):
			logger.debug(traceback.print_tb(e.__traceback__))
		else:
			pytest.fail(str(e))
Пример #6
0
def test_playback(address, port):
    """
    Tests NetGear Bare-minimum network playback capabilities
    """
    stream = None
    server = None
    client = None
    try:
        # open stream
        stream = cv2.VideoCapture(return_testvideo_path())
        # open server and client with default params
        client = NetGear(address=address, port=port, receive_mode=True)
        server = NetGear(address=address, port=port)
        # playback
        while True:
            (grabbed, frame_server) = stream.read()
            if not grabbed:
                break
            server.send(frame_server)  # send
            frame_client = client.recv()  # recv
    except Exception as e:
        if (isinstance(e, (ZMQError, ValueError, RuntimeError))
                or address == "172.31.11.15.77"):
            logger.exception(str(e))
        else:
            pytest.fail(str(e))
    finally:
        # clean resources
        if not (stream is None):
            stream.release()
        if not (server is None):
            server.close()
        if not (client is None):
            client.close()
Пример #7
0
def test_client_reliablity(options):
    """
    Testing validation function of NetGear API
    """
    client = None
    frame_client = None
    try:
        # define params
        client = NetGear(
            pattern=1,
            port=[5587] if "multiserver_mode" in options.keys() else 6657,
            receive_mode=True,
            logging=True,
            **options)
        # get data without any connection
        frame_client = client.recv()
        # check for frame
        if frame_client is None:
            raise RuntimeError
    except Exception as e:
        if isinstance(e, (RuntimeError)):
            pytest.xfail("Reconnection ran successfully.")
        else:
            logger.exception(str(e))
    finally:
        # clean resources
        if not (client is None):
            client.close()
Пример #8
0
def test_compression():
	"""
	Testing NetGear's real-time frame compression capabilities
	"""
	try:
		#open streams
		stream = VideoGear(source=return_testvideo_path()).start()
		#define client parameters
		options = {'compression_param':cv2.IMREAD_COLOR} #read color image 
		client = NetGear(pattern = 1, receive_mode = True, logging = True, **options)
		#define server parameters
		options = {'compression_format': '.jpg', 'compression_param':[cv2.IMWRITE_JPEG_OPTIMIZE, 20]} #JPEG compression
		server = NetGear(pattern = 1, logging = True, **options)
		#send over network
		while True:
			frame_server = stream.read()
			if frame_server is None: break
			server.send(frame_server)
			frame_client = client.recv()
		#clean resources
		stream.stop()
		server.close()
		client.close()
	except Exception as e:
		if isinstance(e, (ZMQError, ValueError)):
			logger.error(traceback.print_tb(e.__traceback__))
		else:
			pytest.fail(str(e))
Пример #9
0
def test_primary_mode(receive_mode):
    """
    Tests NetGear Bare-minimum network playback capabilities
    """
    stream = None
    conn = None
    try:
        # open stream
        options_gear = {"THREAD_TIMEOUT": 60}
        stream = VideoGear(source=return_testvideo_path(),
                           **options_gear).start()
        frame = stream.read()
        # open server and client with default params
        conn = NetGear(receive_mode=receive_mode)
        if receive_mode:
            conn.send(frame)
        else:
            frame_client = conn.recv()
    except Exception as e:
        if isinstance(e, ValueError):
            pytest.xfail("Test Passed!")
        elif isinstance(e, (queue.Empty)):
            logger.exception(str(e))
        else:
            pytest.fail(str(e))
    finally:
        # clean resources
        if not (stream is None):
            stream.stop()
        if not (conn is None):
            conn.close()
Пример #10
0
class CamStreamer(object):
    def __init__(self):
        self.client = NetGear(address="192.168.0.10",
                              port="5566",
                              protocol='tcp',
                              pattern=1,
                              logging=True,
                              receive_mode=True,
                              **options)

    def __del__(self):
        self.client.close()

    def get_frame(self):
        frame = None
        try:
            image = self.client.recv()
            # 因为opencv读取的图片并非jpeg格式,因此要用motion JPEG模式需要先将图片转码成jpg格式图片
            ret, jpeg = cv2.imencode('.jpg', image)
            frame = jpeg.tobytes()
            #print frame
        except:
            #print "frame process error!"
            if camstream:
                cam = camstream.pop()
                del cam
        return frame
Пример #11
0
async def test_benchmark_NetGear():
    """
    Benchmark NetGear original in FPS
    """
    try:
        # open stream with valid source
        stream = VideoGear(source=return_testvideo_path()).start()
        # open server and client
        client = NetGear(receive_mode=True, pattern=1)
        server = NetGear(pattern=1)
        # start FPS handler
        fps = FPS().start()
        # playback
        while True:
            frame_server = stream.read()
            if frame_server is None:
                break
            fps.update()  # update
            server.send(frame_server)  # send
            frame_client = client.recv()  # recv
        stream.stop()
    except Exception as e:
        pytest.fail(str(e))
    finally:
        # close
        server.close()
        client.close()
        logger.info("NetGear approx. FPS: {:.2f}".format(fps.average_fps()))
Пример #12
0
def test_secure_mode(pattern, security_mech, custom_cert_location, overwrite_cert):
    """
    Testing NetGear's Secure Mode
    """
    # define security mechanism
    options = {
        "secure_mode": security_mech,
        "custom_cert_location": custom_cert_location,
        "overwrite_cert": overwrite_cert,
    }
    # initialize
    frame_server = None
    stream = None
    server = None
    client = None
    try:
        # open stream
        stream = VideoGear(source=return_testvideo_path()).start()
        # define params
        server = NetGear(pattern=pattern, logging=True, **options)
        client = NetGear(pattern=pattern, receive_mode=True, logging=True, **options)
        # select random input frame from stream
        i = 0
        while i < random.randint(10, 100):
            frame_server = stream.read()
            i += 1
        # check input frame is valid
        assert not (frame_server is None)
        # send and recv input frame
        server.send(frame_server)
        frame_client = client.recv()
        # check if received frame exactly matches input frame
        assert np.array_equal(frame_server, frame_client)
    except Exception as e:
        if isinstance(e, (ZMQError, ValueError)):
            logger.exception(str(e))
        elif (
            isinstance(e, AssertionError)
            and custom_cert_location == "INVALID_DIRECTORY"
        ):
            logger.exception(str(e))
        else:
            pytest.fail(str(e))
    finally:
        # clean resources
        if not (stream is None):
            stream.stop()
        if not (server is None):
            server.close()
        if not (client is None):
            client.close()
Пример #13
0
def test_patterns(pattern):
    """
    Testing NetGear different messaging patterns
    """
    # define parameters
    options = {
        "flag": 0,
        "copy": False,
        "track": False,
        "jpeg_compression": False
    }
    # initialize
    frame_server = None
    stream = None
    server = None
    client = None
    try:
        # open stream
        stream = cv2.VideoCapture(return_testvideo_path())
        client = NetGear(pattern=pattern,
                         receive_mode=True,
                         logging=True,
                         **options)
        server = NetGear(pattern=pattern, logging=True, **options)
        # select random input frame from stream
        i = 0
        random_cutoff = random.randint(10, 100)
        while i < random_cutoff:
            (grabbed, frame_server) = stream.read()
            i += 1
        # check if input frame is valid
        assert not (frame_server is None)
        # send frame over network
        server.send(frame_server)
        frame_client = client.recv(
            return_data=[1, 2, 3] if pattern == 2 else None)
        # check if received frame exactly matches input frame
        assert np.array_equal(frame_server, frame_client)
    except Exception as e:
        if isinstance(e, (ZMQError, ValueError, RuntimeError)):
            logger.exception(str(e))
        else:
            pytest.fail(str(e))
    finally:
        # clean resources
        if not (stream is None):
            stream.release()
        if not (server is None):
            server.close()
        if not (client is None):
            client.close()
Пример #14
0
def test_compression(options_server):
    """
    Testing NetGear's real-time frame compression capabilities
    """
    # initialize
    stream = None
    server = None
    client = None
    try:
        # open streams
        options_gear = {"THREAD_TIMEOUT": 60}
        colorspace = (
            "COLOR_BGR2GRAY"
            if isinstance(options_server["jpeg_compression"], str)
            and options_server["jpeg_compression"].strip().upper() == "GRAY"
            else None
        )
        stream = VideoGear(
            source=return_testvideo_path(), colorspace=colorspace, **options_gear
        ).start()
        client = NetGear(pattern=0, receive_mode=True, logging=True)
        server = NetGear(pattern=0, logging=True, **options_server)
        # send over network
        while True:
            frame_server = stream.read()
            if frame_server is None:
                break
            server.send(frame_server)
            frame_client = client.recv()
            if (
                isinstance(options_server["jpeg_compression"], str)
                and options_server["jpeg_compression"].strip().upper() == "GRAY"
            ):
                assert (
                    frame_server.ndim == frame_client.ndim
                ), "Grayscale frame Test Failed!"
    except Exception as e:
        if isinstance(e, (ZMQError, ValueError, RuntimeError, queue.Empty)):
            logger.exception(str(e))
        else:
            pytest.fail(str(e))
    finally:
        # clean resources
        if not (stream is None):
            stream.stop()
        if not (server is None):
            server.close()
        if not (client is None):
            client.close()
Пример #15
0
class VideoCamera(object):
    def __init__(self):
        self.BC = BirdCamera()
        options = {'flag' : 0, 'copy' : False, 'track' : False, 'compression_param':cv2.IMREAD_COLOR}
        self.client = NetGear(address = '192.168.2.71', port = '5555', protocol = 'tcp',  pattern = 0, receive_mode = True, logging = True, **options)
        self.grabbed = True
        self.frame = self.client.recv()
        self.lock = threading.Lock()
        threading.Thread(target=self.update, args=()).start()
        
        
    def __del__(self):
        self.client.close()

    def get_frame(self):
        with self.lock:
            if self.frame is not None:
                image = self.frame
                ret, jpeg = cv2.imencode('.jpg', image)
                return jpeg.tobytes()
            else:
                return None

    def update(self):        
        while True:
            with self.lock:
                frame = self.client.recv()
                self.BC.processimages(frame)
                # for location in self.BC.objectscurrentframe:
                #       cv2.rectangle(frame , ( int(location[0] - vert / 4), int(location[1] - vert / 4)), (int(location[0] + vert / 4),  int(location[1] + vert / 4)), (255, 255, 255))
                concat_frame = np.concatenate((self.BC.fgmask,self.BC.imdil, self.BC._reduceframe(frame)),axis=0)
                self.frame = concat_frame
                if self.frame is not None:
                    self.grabbed = True
                else: 
                    self.grabbed = False
Пример #16
0
def test_compression(options_client):
    """
    Testing NetGear's real-time frame compression capabilities
    """
    options = {
        "compression_format":
        ".jpg",
        "compression_param": [
            cv2.IMWRITE_JPEG_QUALITY,
            20,
            cv2.IMWRITE_JPEG_OPTIMIZE,
            True,
        ],
    }  # JPEG compression
    # initialize
    stream = None
    server = None
    client = None
    try:
        # open streams
        options_gear = {"THREAD_TIMEOUT": 60}
        stream = VideoGear(source=return_testvideo_path(),
                           **options_gear).start()
        client = NetGear(pattern=0,
                         receive_mode=True,
                         logging=True,
                         **options_client)
        server = NetGear(pattern=0, logging=True, **options)
        # send over network
        while True:
            frame_server = stream.read()
            if frame_server is None:
                break
            server.send(frame_server)
            frame_client = client.recv()
    except Exception as e:
        if isinstance(e, (ZMQError, ValueError, RuntimeError, queue.Empty)):
            logger.exception(str(e))
        else:
            pytest.fail(str(e))
    finally:
        # clean resources
        if not (stream is None):
            stream.stop()
        if not (server is None):
            server.close()
        if not (client is None):
            client.close()
Пример #17
0
def test_bidirectional_mode(target_data):
	"""
	Testing NetGear's Bidirectional Mode with different datatypes
	"""
	try:
		logger.debug('Given Input Data: {}'.format(target_data))

		#open strem
		stream = VideoGear(source=return_testvideo_path()).start()
		#activate bidirectional_mode
		options = {'bidirectional_mode': True}
		#define params
		client = NetGear(receive_mode = True, logging = True, **options)
		server = NetGear(logging = True, **options)
		#get frame from stream
		frame_server = stream.read()
		assert not(frame_server is None)

		#sent frame and data from server to client
		server.send(frame_server, message = target_data)
		#client recieves the data and frame and send its data
		server_data, frame_client = client.recv(return_data = target_data)
		#server recieves the data and cycle continues
		client_data = server.send(frame_server, message = target_data)

		#clean resources
		stream.stop()
		server.close()
		client.close()

		#logger.debug data recieved at client-end and server-end
		logger.debug('Data recieved at Server-end: {}'.format(server_data))
		logger.debug('Data recieved at Client-end: {}'.format(client_data))
		
		#check if recieved frame exactly matches input frame
		assert np.array_equal(frame_server, frame_client)
		#check if client-end data exactly matches server-end data
		assert client_data == server_data
	except Exception as e:
		if isinstance(e, (ZMQError, ValueError)):
			logger.error(traceback.print_tb(e.__traceback__))
		else:
			pytest.fail(str(e))
Пример #18
0
class Compute:
    def __init__(self, **kwargs):
        self.compute = NetGear(**kwargs)

    def read(self, processed_frame=None):
        """Read data from client and send back a processed frame
        Args:
            processed_frame (NumPy array)
        Returns:
            data : server_data, frame (string, NumPy array).

        Note : server_data can be any type, but here it will be
            only a string
        """
        data = self.compute.recv(return_data=processed_frame)
        return data

    def close(self):
        """Safely terminates the threads, and NetGear resources."""
        self.compute.close()
Пример #19
0
def test_compression(options_client):
    """
	Testing NetGear's real-time frame compression capabilities
	"""
    try:
        # open streams
        stream = VideoGear(source=return_testvideo_path()).start()
        client = NetGear(pattern=0,
                         receive_mode=True,
                         logging=True,
                         **options_client)
        # define server parameters
        options = {
            "compression_format":
            ".jpg",
            "compression_param": [
                cv2.IMWRITE_JPEG_QUALITY,
                20,
                cv2.IMWRITE_JPEG_OPTIMIZE,
                True,
            ],
        }  # JPEG compression
        server = NetGear(pattern=0, logging=True, **options)
        # send over network
        while True:
            frame_server = stream.read()
            if frame_server is None:
                break
            server.send(frame_server)
            frame_client = client.recv()
        # clean resources
        stream.stop()
        server.close()
        client.close()
    except Exception as e:
        if isinstance(e, (ZMQError, ValueError)):
            logger.exception(str(e))
        else:
            pytest.fail(str(e))
Пример #20
0
class server:
    def __init__(self, ip='192.168.10.50', port_1=10000, port_2=5454):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

        self.server_address = (ip, port_1)
        self.sock.bind(self.server_address)
        self.client = NetGear(address=ip,
                              port=port_2,
                              protocol='tcp',
                              pattern=0,
                              receive_mode=True,
                              logging=True,
                              flag=0,
                              copy=False,
                              track=False)

    def receive_data(self, image_capture=True):
        if image_capture:
            frame = self.client.recv()
        data, address = self.sock.recvfrom(100)  # blocking IO
        data = json.loads(data)

        return frame, data, address
Пример #21
0
def test_secure_mode(pattern, security_mech, custom_cert_location, overwrite_cert):
	"""
	Testing NetGear's Secure Mode
	"""
	try:
		#open stream
		stream = VideoGear(source=return_testvideo_path()).start()

		#define security mechanism
		options = {'secure_mode': security_mech, 'custom_cert_location': custom_cert_location, 'overwrite_cert': overwrite_cert}
			
		#define params
		server = NetGear(pattern = pattern, logging = True, **options)
		client = NetGear(pattern = pattern, receive_mode = True, logging = True, **options)
		#initialize
		frame_server = None
		#select random input frame from stream
		i = 0
		while (i < random.randint(10, 100)):
			frame_server = stream.read()
			i+=1
		#check input frame is valid
		assert not(frame_server is None)
		#send and recv input frame
		server.send(frame_server)
		frame_client = client.recv()
		#clean resources
		stream.stop()
		server.close()
		client.close()
		#check if recieved frame exactly matches input frame
		assert np.array_equal(frame_server, frame_client)
	except Exception as e:
		if isinstance(e, (ZMQError, ValueError)):
			logger.error(traceback.print_tb(e.__traceback__))
		else:
			pytest.fail(str(e))
Пример #22
0
# loop over
while True:

     # read frames from stream
    frame = stream.read()

    # check for frame if Nonetype
    if frame is None:
        break

    # reducer frames size if you want more performance, otherwise comment this line
    frame = reducer(frame, percentage = 30) #reduce frame by 30%

    # receive data from server and also send our data
    data = client.recv(return_data = frame)

    # check for data if None
    if data is None:
        break

    # extract server_data & frame from data
    server_data, frame = data

    # again check for frame if None
    if frame is None:
        break

    # {do something with the extracted frame and data here}

    # lets print extracted server data
Пример #23
0
import socket
import cv2
import numpy as np
from vidgear.gears import NetGear

#define netgear client with `receive_mode = True` and default settings
server = NetGear(address='127.0.0.1', port='35560', receive_mode=True)

# infinite loop
while True:
    frame = server.recv()

    if frame is None:
        break

    cv2.namedWindow('Output Frame', cv2.WINDOW_GUI_NORMAL)
    cv2.setWindowProperty('Output Frame', cv2.WND_PROP_FULLSCREEN,
                          cv2.WINDOW_FULLSCREEN)
    cv2.moveWindow('Output Frame', 100, 400)
    cv2.resizeWindow('Output Frame', 400, 255)
    cv2.imshow("Output Frame", frame)

    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break

# close output window
cv2.destroyAllWindows()

# safely close client
server.close()
Пример #24
0
# Define NetGear Client at Server's IP address and assign a unique port address and other parameters
client = NetGear(
    address=addr,
    port=port,
    protocol=proto,
    pattern=pattern,
    receive_mode=True,
    logging=True,
    **
    options)  # !!! change following IP address '192.168.x.xxx' with yours !!!

# loop over
while True:
    # receive data from server
    frame = client.recv()

    # check for frame if None
    if frame is None:
        break

    # {do something with frame here}

    # Show output window
    cv2.imshow("Client 5577 Output", frame)

    # check for 'q' key if pressed
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break
Пример #25
0
def main(args):
    client_options = {
        'compression_format': '.jpg',
        'compression_param': cv2.IMREAD_COLOR,
        'flag': 1
    }
    client = NetGear(address=args.address,
                     port=args.port,
                     protocol='tcp',
                     bidirectional_mode=True,
                     pattern=1,
                     receive_mode=True,
                     logging=True,
                     **client_options)

    face_detector = None
    mask_detector = None

    if args.detection_method == 'dnn':
        model_file = "models/res10_300x300_ssd_iter_140000_fp16.caffemodel"
        config_file = "models/deploy.prototxt"
        face_detector = utils.load_cvdnn(model_file, config_file)
    elif args.detection_method == 'haar':
        model_file = 'models/haarcascade_frontalface_alt.xml'
        face_detector = utils.load_haar_cascade(model_file)

    if not args.ignore_masks:
        # Load mask detector
        # Credit for the model: https://github.com/chandrikadeb7/Face-Mask-Detection
        mask_detector = utils.load_masknet("models/mask_detector.model")

    # Keep track of FPS
    frame_counter = 0
    start_time = None

    # Bookkeeping for face tracking
    next_id = count(0)
    objects = {}

    target_coords = []
    target_bb_size = 0
    target = None
    while True:

        # receive frames from network
        data = client.recv(return_data=(target_coords, target_bb_size))
        if start_time is None:
            start_time = time.time()

        # check for received frame if Nonetype
        if data is None:
            break
        _, frame = data

        if frame_counter % args.frameskip == 0:
            if args.detection_method == 'dnn':
                face_locations = utils.get_face_locations_dnn(
                    frame, face_detector)
            else:
                face_locations = utils.get_face_locations_hog(frame)

            # Update the object positions and other parametes
            utils.update_objects(objects, face_locations, next_id)

            if frame_counter % args.mask_detect_freq == 0:
                # Update the mask status of the faces
                utils.detect_mask(frame, objects, mask_detector)

            # Choose the target
            if target not in objects.keys() or objects[target]['has_mask']:
                temp = [i for i, val in objects.items() if not val['has_mask']]
                if temp:
                    target = temp[0]
                else:
                    target = None
            if target is not None:
                target_coords = objects[target]['centroid']
                # Change to centered coordinates
                h, w, _ = frame.shape
                x0, y0 = (w // 2, h // 2)
                target_coords = (target_coords[0] - x0, target_coords[1] - y0)

                # Bounding box size
                (top, right, bottom, left) = objects[target]['bounding_box']
                target_bb_size = round(
                    np.linalg.norm([(top, right), (bottom, left)]), 2)

            else:
                target_coords = []
                target_bb_size = 0

        if args.show_video:
            # Draw the extra information onto the frame
            frame = utils.draw_bounding_boxes(frame, objects)
            # h, w, _ = frame.shape
            # cv2.circle(frame, (w//2, h//2), radius=5,
            #        color=(0, 255, 0), thickness=-1)

            # Show output
            if args.track_face and target is not None:
                (top, right, bottom, left) = objects[target]['bounding_box']
                cv2.imshow("Output Frame", frame[bottom:top, left:right])
            else:
                cv2.imshow("Output Frame", frame)

            # check for 'q' key if pressed
            key = cv2.waitKey(1) & 0xFF
            if key == ord("q"):
                break

            frame_counter += 1

    elapsed_time = time.time() - start_time
    print(f"avg FPS: {frame_counter/elapsed_time}")

    # close output window
    cv2.destroyAllWindows()

    # safely close client
    client.close()
Пример #26
0
def receive(category_index,
            model,
            address,
            port,
            protocol,
            pattern=0,
            min_detections=10,
            min_confidence=0.7,
            server_plugins={},
            **kwargs):
    """Main receiver loop for network detection

    Args:
        category_index (category_index): category_index
        model (model): Model to use
        address (str): URL of `OpenCV` sender / Pi
        port (int): Port of `OpenCV` sender / Pi
        protocol (str): Protocol of of `OpenCV` sender / Pi
        pattern (int, optional): ZMQ Pattern. 0=`zmq.PAIR`, 1=`zmq.REQ/zmq.REP`; 2=`zmq.PUB,zmq.SUB`. Defaults to 0.
        min_detections (int, optional): Minimum detections required to yield a positive result. Defaults to 10.
        min_confidence (float, optional): Minimum average confidence required to yield a positive result. Defaults to 0.7.

    Yields:
        bool: True for a successful detection
    """
    client = NetGear(
        address=address,
        port=str(port),
        protocol=protocol,
        pattern=pattern,
        receive_mode=True,
        logging=True)  # Define netgear client at Server IP address.

    # For detection thresholds
    c = 0
    if 'detection_threshold' in kwargs and 'fps' in kwargs:
        THRESHOLD_FRAMES = kwargs.get('detection_threshold') * kwargs.get(
            'fps')
        logger.debug('Using {} frames as {}s threshold'.format(
            THRESHOLD_FRAMES, kwargs.get('detection_threshold')))
    else:
        THRESHOLD_FRAMES = -1
        logger.warning('Threshold is disabled')

    # Detection
    i = 0
    confidence = 0
    p_res = False

    # infinite loop
    while True:
        # receive frames from network
        # TODO: time sleep comes from my fork of vidgear - might break lib
        frame = client.recv()
        logger.debug('Image received')
        image_np = np.copy(frame)
        # check if frame is None
        if image_np is None:
            logger.error('No frame available')
            break

        c += 1
        # If threshold is enabled, drop frames if we got a previous result and are below the detection threshold
        if THRESHOLD_FRAMES != -1 and c < THRESHOLD_FRAMES and p_res:
            logger.debug('Below threshold, dropping frame at {}'.format(c))
            continue

        # Server plugins - before
        run_image_detector_plugins_before(server_plugins, image_np)

        # Actual detection.
        res, i, confidence, np_det_img = detect(model, category_index,
                                                image_np, i, confidence,
                                                min_detections, min_confidence)
        if res:
            yield True
            p_res = res

        # Server plugins - after
        run_image_detector_plugins_after(server_plugins, res, i, confidence,
                                         np_det_img)

        key = cv2.waitKey(1) & 0xFF
        # check for 'q' key-press
        if key == ord("q"):
            # if 'q' key-pressed break out
            break

    # close output window
    cv2.destroyAllWindows()
    # safely close client
    client.close()
Пример #27
0
            influxdb_client.write_points(
                influx_data,
                database="MainDatabase",
                batch_size=batch_size,
                time_precision="u",  # micro secs
                protocol="line",
            )
        influx_data = []
    # add random delay
    if np.random.random() < args.delay_prob:
        random_delay = round(np.random.random() / 10, 2)
        time.sleep(random_delay)
    else:
        random_delay = 0
    # receive frames from network
    data = client.recv()
    if data is None:
        break
    toc = time.time()
    n_bytes_2 = data_rate.get_rx_bytes()

    # Current FPS
    fps = 1 / (toc - tic)
    # Current Data Rate
    rx_rate = round((n_bytes_2 - n_bytes_1) / ((toc - tic) * 1024.0 * 1024.0),
                    4)

    # reset clock
    tic = toc

    # receive frame and timestamp
Пример #28
0
def test_bidirectional_mode(pattern, target_data, options):
    """
    Testing NetGear's Bidirectional Mode with different data-types
    """
    # initialize
    stream = None
    server = None
    client = None
    try:
        logger.debug(
            "Given Input Data: {}".format(target_data if not isinstance(
                target_data, np.ndarray) else "IMAGE"))
        # open stream
        options_gear = {"THREAD_TIMEOUT": 60}
        # change colorspace
        colorspace = ("COLOR_BGR2GRAY"
                      if isinstance(options["jpeg_compression"], str)
                      and options["jpeg_compression"].strip().upper() == "GRAY"
                      else None)
        if colorspace == "COLOR_BGR2GRAY" and isinstance(
                target_data, np.ndarray):
            target_data = cv2.cvtColor(target_data, cv2.COLOR_BGR2GRAY)

        stream = VideoGear(source=return_testvideo_path(),
                           colorspace=colorspace,
                           **options_gear).start()
        # define params
        client = NetGear(pattern=pattern,
                         receive_mode=True,
                         logging=True,
                         **options)
        server = NetGear(pattern=pattern, logging=True, **options)
        # check if target data is numpy ndarray
        if isinstance(target_data, np.ndarray):
            # sent frame and data from server to client
            server.send(target_data, message=target_data)
            # client receives the data and frame and send its data
            server_data, frame_client = client.recv(return_data=target_data)
            # server receives the data and cycle continues
            client_data = server.send(target_data)
            # test if recieved successfully
            assert not (client_data is None), "Test Failed!"
        else:
            # get frame from stream
            frame_server = stream.read()
            assert not (frame_server is None)
            # sent frame and data from server to client
            server.send(frame_server, message=target_data)
            # client receives the data and frame and send its data
            server_data, frame_client = client.recv(return_data=target_data)
            # server receives the data and cycle continues
            client_data = server.send(frame_server, message=target_data)
            # check if received frame exactly matches input frame
            if not options["jpeg_compression"] in [True, "GRAY", ["invalid"]]:
                assert np.array_equal(frame_server, frame_client)
            # logger.debug data received at client-end and server-end
            logger.debug("Data received at Server-end: {}".format(server_data))
            logger.debug("Data received at Client-end: {}".format(client_data))
            assert client_data == server_data
    except Exception as e:
        if isinstance(e, (ZMQError, ValueError, RuntimeError, queue.Empty)):
            pytest.xfail(str(e))
        else:
            pytest.fail(str(e))
    finally:
        # clean resources
        if not (stream is None):
            stream.stop()
        if not (server is None):
            server.close()
        if not (client is None):
            client.close()
Пример #29
0
def test_multiserver_mode(pattern, options):
    """
    Testing NetGear's Multi-Server Mode with three unique servers
    """
    # initialize
    frame_server = None
    stream = None
    server_1 = None
    server_2 = None
    server_3 = None
    client = None
    # define client-end dict to save frames in-accordance with unique port
    client_frame_dict = {}
    try:
        # open stream
        stream = cv2.VideoCapture(return_testvideo_path())
        # define a single client
        client = NetGear(port=["5556", "5557", "5558"],
                         pattern=pattern,
                         receive_mode=True,
                         logging=True,
                         **options)
        # define three unique server
        server_1 = NetGear(pattern=pattern,
                           port="5556",
                           logging=True,
                           **options)  # at port `5556`
        server_2 = NetGear(pattern=pattern,
                           port="5557",
                           logging=True,
                           **options)  # at port `5557`
        server_3 = NetGear(pattern=pattern,
                           port="5558",
                           logging=True,
                           **options)  # at port `5558`
        i = 0
        while i < random.randint(10, 100):
            (grabbed, frame_server) = stream.read()
            i += 1
        # check if input frame is valid
        assert not (frame_server is None)

        # send frame from Server-1 to client and save it in dict
        server_1.send(frame_server)
        unique_address, frame = client.recv()
        client_frame_dict[unique_address] = frame
        # send frame from Server-2 to client and save it in dict
        server_2.send(frame_server)
        unique_address, frame = client.recv()
        client_frame_dict[unique_address] = frame
        # send frame from Server-3 to client and save it in dict
        server_3.send(frame_server)
        unique_address, frame = client.recv()
        client_frame_dict[unique_address] = frame

        # check if recieved frames from each unique server exactly matches input frame
        for key in client_frame_dict.keys():
            assert np.array_equal(frame_server, client_frame_dict[key])

    except Exception as e:
        if isinstance(e, (ZMQError, ValueError, RuntimeError)):
            pytest.xfail(str(e))
        else:
            pytest.fail(str(e))
    finally:
        # clean resources
        if not (stream is None):
            stream.release()
        if not (server_1 is None):
            server_1.close()
        if not (server_2 is None):
            server_2.close()
        if not (server_3 is None):
            server_3.close()
        if not (client is None):
            client.close()
Пример #30
0
def test_multiclient_mode(pattern):
    """
    Testing NetGear's Multi-Client Mode with three unique clients
    """
    # define and activate Multi-Client Mode
    options = {
        "multiclient_mode": True,
        "bidirectional_mode": True,
        "jpeg_compression": False,
    }  # bidirectional_mode is activated for testing only

    # initialize
    frame_client = None
    stream = None
    server = None
    client_1 = None
    client_2 = None
    client_3 = None
    try:
        # open network stream
        options_gear = {"THREAD_TIMEOUT": 60}
        stream = VideoGear(source=return_testvideo_path(),
                           **options_gear).start()
        # define single server
        server = NetGear(pattern=pattern,
                         port=["5556", "5557", "5558"],
                         logging=True,
                         **options)
        # define a three unique clients
        client_1 = NetGear(port="5556",
                           pattern=pattern,
                           receive_mode=True,
                           logging=True,
                           **options)
        client_2 = NetGear(port="5557",
                           pattern=pattern,
                           receive_mode=True,
                           logging=True,
                           **options)
        client_3 = NetGear(port="5558",
                           pattern=pattern,
                           receive_mode=True,
                           logging=True,
                           **options)
        i = 0
        while i < random.randint(10, 100):
            frame_client = stream.read()
            i += 1
        # check if input frame is valid
        assert not (frame_client is None)

        # send frame from 1 server to multiple clients
        server.send(frame_client)
        frame_1 = client_1.recv()
        server.send(frame_client)
        frame_2 = client_2.recv()
        server.send(frame_client)
        frame_3 = client_3.recv()

        # check if received frames from server exactly matches input frame
        assert np.array_equal(frame_1, frame_client)
        assert np.array_equal(frame_2, frame_client)
        assert np.array_equal(frame_3, frame_client)

    except Exception as e:
        if isinstance(e, (ZMQError, ValueError, RuntimeError, queue.Empty)):
            pytest.xfail(str(e))
        else:
            pytest.fail(str(e))
    finally:
        # clean resources
        if not (stream is None):
            stream.stop()
        if not (server is None):
            server.close()
        if not (client_1 is None):
            client_1.close()
        if not (client_2 is None):
            client_1.close()
        if not (client_3 is None):
            client_1.close()