Display JPEG Images Streamed from IP Camera
This example shows how to use an HTTP MultipartConsumer to stream video
from a website. It customizes an ImageConsumer class-CameraPlayer-to display JPEG images
from a hypothetical website derived from an IP address.
To create a working example, you need:
IP address-based URL similar to:
url = 'http://999.99.99.99/video/mjpg.cgi';Credentials similar to:
creds = matlab.net.http.Credentials('Scheme','Basic','User','admin','Pass','admin'); creds.Username = 'yourName'; creds.Password = 'yourPassword';
CameraPlayer Class
An IP camera sends JPEG images as parts of a never-ending multipart message. Each
part has a type of"image/jpeg". To process this message, create a
MultipartConsumer indicating that any part whose type is
"image/*" should be handled by
CameraPlayer. MATLAB® calls the CameraPlayer.putData method for each
frame of the image received, which calls its superclass to convert the data.
CameraPlayer in turn uses imshow to
create a figure window to display the image, and displays subsequent images in the
same window. When the user closes the window, putData returns
stop=true, which causes MATLAB to close the connection.
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
Call CameraPlayer
The following code provides a framework for retrieving images. To run the code,
you must provide values for content within <> characters. The
URL for your web service might include additional parameters, such as login
information and other information specified as name, value pair arguments. To
utilize the CameraPlayer, add it to your call to send. For information about creating
request messages, see Call Web Services from MATLAB Using 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);