Отобразите изображения JPEG, переданные потоком от камеры IP

Этот пример показывает, как использовать MultipartConsumer HTTP, чтобы передать видео потоком от веб-сайта. Это настраивает ImageConsumer class-CameraPlayer-to, отображают изображения JPEG от гипотетического веб-сайта, выведенного от IP-адреса.

Чтобы создать рабочий пример, вам нужно:

  • Основанный на IP-адресе URL, подобный:

    url = 'http://999.99.99.99/video/mjpg.cgi';
  • Учетные данные, подобные:

    creds = matlab.net.http.Credentials('Scheme','Basic','User','admin','Pass','admin');
    creds.Username = 'yourName';
    creds.Password = 'yourPassword';
    

Класс CameraPlayer

Камера IP отправляет изображения JPEG как части бесконечного многослойного сообщения. Каждая часть имеет тип of"image/jpeg". Чтобы обработать это сообщение, создайте MultipartConsumer, указывающий, что любая часть, типом которой является "image/*", должна быть обработана CameraPlayer. MATLAB® вызывает метод CameraPlayer.putData для каждого кадра полученного изображения, который вызывает его суперкласс, чтобы преобразовать данные. CameraPlayer в свою очередь использует imshow, чтобы создать окно рисунка, чтобы отобразить изображение и отображает последующие изображения в том же окне. Когда пользователь закрывает окно, putData возвращает stop=true, который заставляет MATLAB закрывать связь.

classdef CameraPlayer < matlab.net.http.io.ImageConsumer
% CameraPlayer Player for IP camera
%   A ContentConsumer that displays image content types in a figure window.  If
%   specified directly in the RequestMessage.send() operation, it assumes the
%   entire contents of the ResponseMessage is a single image.  If the response
%   is a multipart message, and this is specified as a handler for image
%   types to a GenericConsumer or MultipartConsumer, then this assumes each
%   part is a frame of a video stream and displays them as they are received.
%
%   CameraPlayer properties:
%     CameraPlayer - constructor
%     Image        - the currently displayed Image object
%  
%   The following displays a received image, or a sequence of images received
%   in a multipart message and saves the last image received in the response
%   message Data.  The last image displayed remains visible until cp is
%   deleted.
% 
%     req = RequestMessage;
%     cp = CameraPlayer;
%     resp = req.send(url, [], GenericConsumer('image/*', cp));
%     image = cp.Image;
%     ...operate on image data...

% Copyright 2017 The MathWorks, Inc.

    properties
        % Image - the currently displayed Image object
        %   This image is in an Axes in a Figure.  It is deleted when this object is
        %   deleted.
        Image
        % Enough - control number of times to display message
        Enough
    end
    
    methods
        function obj = CameraPlayer()
            obj = obj@matlab.net.http.io.ImageConsumer();
        end
        
        function [len, stop] = putData(obj, data)
        % putData - called by MATLAB or parent Consumer to process image data
        
            % Pass the data to ImageConsumer, which buffers it until the end of data
            % and then converts it to a MATLAB image depending on the type of image.
            [len, stop] = obj.putData@matlab.net.http.io.ImageConsumer(data);
            if isempty(data)
                % end of image; display the result in Response.Body.Data
                imdata = obj.Response.Body.Data;
                if iscell(imdata) 
                    if ~isempty(imdata{2})
                        % If it was an indexed image if we get a cell array, so convert
                        imdata = ind2rgb(imdata{1},imdata{2});
                    else
                        imdata = imdata{1};
                    end
                end
                if isempty(obj.Image)
                    % First time we are called, create a figure containing the image
                    obj.Image = imshow(imdata);
                    obj.Enough = 0;
                else
                    % Subsequent times we are called, just change CData in an already-displayed
                    % image.

                    obj.Enough = obj.Enough+1;
                    if obj.Enough > 100 
                        disp 'To stop, close figure window.'
                        obj.Enough = 0;
                    end
                    try
                        obj.Image.CData = imdata;
                    catch e
                        % Fails if window closed or data was bad
                        if strcmp(e.identifier, 'MATLAB:class:InvalidHandle')
                            % User must have closed the window; terminate silently
                            stop = true;
                            disp 'Figure window closed.'
                            return
                        end
                    end
                end
                drawnow
            end
        end
        
        function delete(obj)
            delete(obj.Image);
        end
    end
end

Вызовите CameraPlayer

Следующий код служит основой для получения изображений. Чтобы запустить код, необходимо обеспечить значения для содержимого в символах <>. URL для вашего веб-сервиса может включать дополнительные параметры, такие как информация о входе в систему и другая информация, указанная как имя, аргументы пары значения. Чтобы использовать CameraPlayer, добавьте его в свой вызов matlab.net.http.RequestMessage.send. Для получения информации о создании сообщений запроса смотрите Интерфейс HTTP.

url = '<YOUR_URL_CONTAINING_IP_ADDRESS>';
cp = CameraPlayer;
consumer = matlab.net.http.io.MultipartConsumer('image/*',cp);
creds = matlab.net.http.Credentials('Scheme','Basic','User','admin','Pass','admin');
creds.Username = '<YOURNAME>';
creds.Password = '<YOURPASSWORD>';
opts = matlab.net.http.HTTPOptions('Cred',creds,'SavePayload',true);
r = matlab.net.http.RequestMessage();
resp = r.send(url, opts, consumer);