0% found this document useful (0 votes)
3 views

Matlab Computer Vision System Toolbox Documentation instant download

The document provides an overview of the Computer Vision System Toolbox, which includes algorithms and functions for designing and simulating computer vision and video processing systems. Key features include object detection, tracking, camera calibration, and support for C-code generation. It also offers resources for video processing workflows and rapid prototyping in MATLAB and Simulink.

Uploaded by

rubyeozunany
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views

Matlab Computer Vision System Toolbox Documentation instant download

The document provides an overview of the Computer Vision System Toolbox, which includes algorithms and functions for designing and simulating computer vision and video processing systems. Key features include object detection, tracking, camera calibration, and support for C-code generation. It also offers resources for video processing workflows and rapid prototyping in MATLAB and Simulink.

Uploaded by

rubyeozunany
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 76

Matlab Computer Vision System Toolbox

Documentation download

https://ebookbell.com/product/matlab-computer-vision-system-
toolbox-documentation-6741128

Explore and download more ebooks at ebookbell.com


Here are some recommended products that we believe you will be
interested in. You can click the link to download.

Matlab Computer Vision Toolbox Users Guide R2020a The Mathworks

https://ebookbell.com/product/matlab-computer-vision-toolbox-users-
guide-r2020a-the-mathworks-11236240

Matlab And Simulink Computer Vision Toolbox Users Guide Coll

https://ebookbell.com/product/matlab-and-simulink-computer-vision-
toolbox-users-guide-coll-36654278

Matlab And Simulink Computer Vision Toolbox Reference Mathworks

https://ebookbell.com/product/matlab-and-simulink-computer-vision-
toolbox-reference-mathworks-37583894

Mathematical Modeling And Computation In Finance With Exercises And


Python And Matlab Computer Codes Cornelis W Oosterlee

https://ebookbell.com/product/mathematical-modeling-and-computation-
in-finance-with-exercises-and-python-and-matlab-computer-codes-
cornelis-w-oosterlee-22188638
Getting Started In Mathematical Life Sciences From Matlab Programming
To Computer Simulations Makoto Sato

https://ebookbell.com/product/getting-started-in-mathematical-life-
sciences-from-matlab-programming-to-computer-simulations-makoto-
sato-49041318

Matlab For Electrical And Computer Engineering Students And


Professionals With Simulink Roland Priemer

https://ebookbell.com/product/matlab-for-electrical-and-computer-
engineering-students-and-professionals-with-simulink-roland-
priemer-6838280

Computer Programming With Matlab J Michael Fitzpatrick Kos Ldeczi

https://ebookbell.com/product/computer-programming-with-matlab-j-
michael-fitzpatrick-kos-ldeczi-5415618

Computergenerated Phaseonly Holograms For 3d Displays A Matlab


Approach Peter Wai Ming Tsang

https://ebookbell.com/product/computergenerated-phaseonly-holograms-
for-3d-displays-a-matlab-approach-peter-wai-ming-tsang-48222898

Elementary Mathematical And Computational Tools For Electrical And


Computer Engineers Using Matlab Jamal T Manassah

https://ebookbell.com/product/elementary-mathematical-and-
computational-tools-for-electrical-and-computer-engineers-using-
matlab-jamal-t-manassah-2629904
Computer Vision System Toolbox™
Getting Started Guide

R2016a
How to Contact MathWorks

Latest news: www.mathworks.com

Sales and services: www.mathworks.com/sales_and_services

User community: www.mathworks.com/matlabcentral

Technical support: www.mathworks.com/support/contact_us

Phone: 508-647-7000

The MathWorks, Inc.


3 Apple Hill Drive
Natick, MA 01760-2098
Computer Vision System Toolbox™ Getting Started Guide
© COPYRIGHT 2000–2016 by The MathWorks, Inc.
The software described in this document is furnished under a license agreement. The software may be used
or copied only under the terms of the license agreement. No part of this manual may be photocopied or
reproduced in any form without prior written consent from The MathWorks, Inc.
FEDERAL ACQUISITION: This provision applies to all acquisitions of the Program and Documentation
by, for, or through the federal government of the United States. By accepting delivery of the Program
or Documentation, the government hereby agrees that this software or documentation qualifies as
commercial computer software or commercial computer software documentation as such terms are used
or defined in FAR 12.212, DFARS Part 227.72, and DFARS 252.227-7014. Accordingly, the terms and
conditions of this Agreement and only those rights specified in this Agreement, shall pertain to and
govern the use, modification, reproduction, release, performance, display, and disclosure of the Program
and Documentation by the federal government (or other entity acquiring for or through the federal
government) and shall supersede any conflicting contractual terms or conditions. If this License fails
to meet the government's needs or is inconsistent in any respect with federal procurement law, the
government agrees to return the Program and Documentation, unused, to The MathWorks, Inc.
Trademarks
MATLAB and Simulink are registered trademarks of The MathWorks, Inc. See
www.mathworks.com/trademarks for a list of additional trademarks. Other product or brand
names may be trademarks or registered trademarks of their respective holders.
Patents
MathWorks products are protected by one or more U.S. patents. Please see
www.mathworks.com/patents for more information.
Revision History
April 2011 Online only Revised for Version 4.0 (Release 2011a)
September 2011 Online only Revised for Version 4.1 (Release 2011b)
March 2012 Online only Revised for Version 5.0 (Release 2012a)
September 2012 Online only Revised for Version 5.1 (R2012b)
March 2013 Online only Revised for Version 5.2 (R2013a)
September 2013 Online only Revised for Version 5.3 (R2013b)
March 2014 Online only Revised for Version 6.0 (R2014a)
October 2014 Online only Revised for Version 6.1 (R2014b)
March 2015 Online only Revised for Version 6.2 (Release R2015a)
September 2015 Online only Revised for Version 7.0 (Release R2015b)
March 2016 Online only Revised for Version 7.1 (Release R2016a)
Contents

Product Overview
1
Computer Vision System Toolbox Product Description . . . . 1-2
Key Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-2

Computer Vision Algorithms and Video Processing


2
Computer Vision Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . 2-2

Video Processing in MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . 2-3

Computer Vision System Toolbox Preferences . . . . . . . . . . . 2-4


Parallel Computing Toolbox Support . . . . . . . . . . . . . . . . . . . 2-4

Coordinate Systems
3
Coordinate Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-2
Pixel Indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-2
Spatial Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-2
3-D Coordinate Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-3

v
System Objects
4
What Is a System Toolbox? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-2

What Are System Objects? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-3

System Objects vs. MATLAB Functions . . . . . . . . . . . . . . . . . 4-5


System Objects vs. MATLAB Functions . . . . . . . . . . . . . . . . 4-5
Process Audio Data Using Only MATLAB Functions Code . . 4-5
Process Audio Data Using System Objects . . . . . . . . . . . . . . 4-6

System Design and Simulation in MATLAB . . . . . . . . . . . . . . 4-8

System Design and Simulation in Simulink . . . . . . . . . . . . . . 4-9

System Objects in MATLAB Code Generation . . . . . . . . . . . 4-10


System Objects in Generated Code . . . . . . . . . . . . . . . . . . . 4-10
System Objects in codegen . . . . . . . . . . . . . . . . . . . . . . . . . 4-14
System Objects in the MATLAB Function Block . . . . . . . . . 4-15
System Objects in the MATLAB System Block . . . . . . . . . . 4-15
System Objects and MATLAB Compiler Software . . . . . . . . 4-15

System Objects Methods That Support Code Generation . . 4-16


Code Generation Supported System Objects Methods . . . . . 4-16
Simulation-Only System Objects Methods . . . . . . . . . . . . . . 4-16

System Objects in Simulink . . . . . . . . . . . . . . . . . . . . . . . . . . 4-18


System Objects in the MATLAB Function Block . . . . . . . . . 4-18
System Objects in the MATLAB System Block . . . . . . . . . . 4-18

System Object Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-19


What Are System Object Methods? . . . . . . . . . . . . . . . . . . . 4-19
The Step Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-19
Common Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-20

System Design in MATLAB Using System Objects . . . . . . . . 4-22


Predefined Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-22
Create Components for Your System . . . . . . . . . . . . . . . . . . 4-22
Component Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-23
Configure Component Property Values . . . . . . . . . . . . . . . . 4-23
Create and Configure Components at the Same Time . . . . . 4-24

vi Contents
Connecting System Objects . . . . . . . . . . . . . . . . . . . . . . . . . 4-25
Connect Components in a System . . . . . . . . . . . . . . . . . . . . 4-25
Run Your System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-27
Reconfiguring Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-28
Change a Tunable Property in Your System . . . . . . . . . . . . 4-28

System Design in Simulink Using System Objects . . . . . . . 4-31


Define New Kinds of System Objects for Use in Simulink . . 4-31
Test New System Objects in MATLAB . . . . . . . . . . . . . . . . 4-36
Add System Objects to Your Simulink Model . . . . . . . . . . . 4-37

Strategies for Real-Time Video Processing in


Simulink
5
Optimizing Your Implementation . . . . . . . . . . . . . . . . . . . . . . 5-2

Developing Your Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-4

Data Type Support


6
Block Data Type Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-2

Fixed-Point Support for MATLAB System Objects . . . . . . . . 6-3


Getting Information About Fixed-Point System Objects . . . . . 6-3
Setting System Object Fixed-Point Properties . . . . . . . . . . . . 6-4

vii
1

Product Overview
1 Product Overview

Computer Vision System Toolbox Product Description


Design and simulate computer vision and video processing systems

Computer Vision System Toolbox provides algorithms, functions, and apps for designing
and simulating computer vision and video processing systems. You can perform feature
detection, extraction, and matching; object detection and tracking; motion estimation;
and video processing. For 3-D computer vision, the system toolbox supports camera
calibration, stereo vision, 3-D reconstruction, and 3-D point cloud processing. With
machine learning based frameworks, you can train object detection, object recognition,
and image retrieval systems. Algorithms are available as MATLAB® functions, System
objects, and Simulink® blocks.

For rapid prototyping and embedded system design, the system toolbox supports fixed-
point arithmetic and C-code generation.

Key Features
• Object detection and tracking, including the Viola-Jones, Kanade-Lucas-Tomasi
(KLT), and Kalman filtering methods
• Training of object detection, object recognition, and image retrieval systems, including
cascade object detection and bag-of-features methods
• Camera calibration for single and stereo cameras, including automatic checkerboard
detection and an app for workflow automation
• Stereo vision, including rectification, disparity calculation, and 3-D reconstruction
• 3-D point cloud processing, including I/O, visualization, registration, denoising, and
geometric shape fitting
• Feature detection, extraction, and matching
• Support for C-code generation and fixed-point arithmetic with code generation
products

1-2
2

Computer Vision Algorithms and


Video Processing

• “Computer Vision Capabilities” on page 2-2


• “Video Processing in MATLAB” on page 2-3
• “Computer Vision System Toolbox Preferences” on page 2-4
2 Computer Vision Algorithms and Video Processing

Computer Vision Capabilities


Computer Vision System Toolbox provides algorithms and tools for the design and
simulation of computer vision and video processing systems. The toolbox includes
algorithms for feature extraction, motion detection, object detection, object tracking,
stereo vision, video processing, and video analysis. Tools include video file I/O, video
display, drawing graphics, and compositing. Capabilities are provided as MATLAB
functions, MATLAB System objects, and Simulink blocks. For rapid prototyping and
embedded system design, the system toolbox supports fixed-point arithmetic and C-code
generation.

The link below provides an overview video of Computer Vision System Toolbox
capabilities and applications:

Computer Vision System Toolbox capabilities

2-2
Video Processing in MATLAB

Video Processing in MATLAB


Computer Vision System Toolbox provides algorithms and tools for video processing
workflows. You can read and write from common video formats, perform common video
processing algorithms such as deinterlacing and chroma-resampling, and display results
with text and graphics burnt in to the video. Video processing in MATLAB uses System
objects, which avoids excessive memory use by streaming data to and from video files.

The link below provides an introduction video to a typical workflow for motion
estimation:
Video processing in MATLAB

2-3
2 Computer Vision Algorithms and Video Processing

Computer Vision System Toolbox Preferences


To open Computer Vision System Toolbox preferences, on the Home tab, in the
Environment section, click Preferences. Select Computer Vision System
Toolbox.

Parallel Computing Toolbox Support


Several Computer Vision System Toolbox functions support parallel computing using
multiple MATLAB workers. Select the Use Parallel check box to enable parallel
computing when possible.

2-4
Computer Vision System Toolbox Preferences

Parallel computing functionality requires a Parallel Computing Toolbox™ license and an


open MATLAB pool.

The functions and methods listed below take an optional logical input parameter,
'UseParallel' to control whether the individual function can use parfor. Set this
logical to 'true' to enable parallel processing for the function or method.

• bagOfFeatures
• encode (bagOfFeatures)
• trainImageCategoryClassifier
• imageCategoryClassifier
• predict (imageCategoryClassifier)

See parpool for details on how to create a special job on a pool of workers, and connect
the MATLAB client to the parallel pool.

2-5
3

Coordinate Systems
3 Coordinate Systems

Coordinate Systems
You can specify locations in images using various coordinate systems. Coordinate
systems are used to place elements in relation to each other. Coordinates in pixel and
spatial coordinate systems relate to locations in an image. Coordinates in 3-D coordinate
systems describe the 3-D positioning and origin of the system.

Pixel Indices
Pixel coordinates enable you to specify locations in images. In the pixel coordinate
system, the image is treated as a grid of discrete elements, ordered from top to bottom
and left to right.

For pixel coordinates, the number of rows, r, downward, while the number of columns, c,
increase to the right. Pixel coordinates are integer values and range from 1 to the length
of the row or column. The pixel coordinates used in Computer Vision System Toolbox
software are one-based, consistent with the pixel coordinates used by Image Processing
Toolbox™ and MATLAB. For more information on the pixel coordinate system, see “Pixel
Indices” in the Image Processing Toolbox documentation.

Spatial Coordinates
Spatial coordinates enable you to specify a location in an image with greater granularity
than pixel coordinates. Such as, in the pixel coordinate system, a pixel is treated as a
discrete unit, uniquely identified by an integer row and column pair, such as (3,4). In
the spatial coordinate system, locations in an image are represented in terms of partial
pixels, such as (3.3, 4.7).

3-2
Coordinate Systems

For more information on the spatial coordinate system, see “Spatial Coordinates” in the
Image Processing Toolbox documentation.

3-D Coordinate Systems


When you reconstruct a 3-D scene, you can define the resulting 3-D points in one of two
coordinate systems. In a camera-based coordinate system, the points are defined relative
to the center of the camera. In a calibration pattern-based coordinate system, the points
are defined relative to a point in the scene.

The Computer Vision System Toolbox functions use the right-handed world coordinate
system. In this system, the x-axis points to the right, the y-axis points down, and the z-
axis points away from the camera. To display 3-D points, use pcshow.

Camera-Based Coordinate System

Points represented in a camera-based coordinate system are described with the origin
located at the optical center of the camera.

3-3
3 Coordinate Systems

In a stereo system, the origin is located at the optical center of Camera 1.

camera 1 camera 2

When you reconstruct a 3-D scene using a calibrated stereo camera, the
reconstructScene and triangulate functions return 3-D points with the origin at
the optical center of Camera 1. When you use Kinect® images, the depthToPointCloud
function returns 3-D points with the origin at the center of the RGB camera.

Calibration Pattern-Based Coordinate System

Points represented in a calibration pattern-based coordinate system are described with


the origin located at the (0,0) location of the calibration pattern.

When you reconstruct a 3-D scene from multiple views containing a calibration pattern,
the resulting 3-D points are defined in the pattern-based coordinate system. The
“Structure From Motion From Two Views” example shows how to reconstruct a 3-D scene
from a pair of 2-D images containing a checkerboard pattern.

Related Examples
• “Measuring Planar Objects with a Calibrated Camera”

3-4
Coordinate Systems

• “Structure From Motion From Two Views”


• “Structure From Motion From Multiple Views”
• “Depth Estimation From Stereo Video”

3-5
4

System Objects

• “What Is a System Toolbox?” on page 4-2


• “What Are System Objects?” on page 4-3
• “System Objects vs. MATLAB Functions” on page 4-5
• “System Design and Simulation in MATLAB” on page 4-8
• “System Design and Simulation in Simulink” on page 4-9
• “System Objects in MATLAB Code Generation” on page 4-10
• “System Objects Methods That Support Code Generation” on page 4-16
• “System Objects in Simulink” on page 4-18
• “System Object Methods” on page 4-19
• “System Design in MATLAB Using System Objects” on page 4-22
• “System Design in Simulink Using System Objects” on page 4-31
4 System Objects

What Is a System Toolbox?


System Toolbox products provide algorithms and tools for designing, simulating,
and deploying dynamic systems in MATLAB and Simulink. These toolboxes contain
MATLAB functions, System objects, and Simulink blocks that deliver the same design
and verification capabilities across MATLAB and Simulink, enabling more effective
collaboration among system designers. Available System Toolbox products include:

• DSP System Toolbox™


• Communications System Toolbox™
• Computer Vision System Toolbox
• Phased Array System Toolbox™

System Toolboxes support floating-point and fixed-point streaming data simulation


for both sample- and frame-based data. They provide a programming environment for
defining and executing code for various aspects of a system, such as initialization and
reset. System Toolboxes also support code generation for a range of system development
tasks and workflows, such as:

• Rapid development of reusable IP and test benches


• Sharing of component libraries and systems models across teams
• Large system simulation
• C-code generation for embedded processors
• Finite wordlength effects modeling and optimization
• Ability to prototype and test on real-time hardware

4-2
What Are System Objects?

What Are System Objects?


A System object™ is a specialized kind of MATLAB object. System Toolboxes include
System objects and most System Toolboxes also have MATLAB functions and Simulink
blocks. System objects are designed specifically for implementing and simulating
dynamic systems with inputs that change over time. Many signal processing,
communications, and controls systems are dynamic. In a dynamic system, the values
of the output signals depend on both the instantaneous values of the input signals and
on the past behavior of the system. System objects use internal states to store that past
behavior, which is used in the next computational step. As a result, System objects are
optimized for iterative computations that process large streams of data, such as video
and audio processing systems.

For example, you could use System objects in a system that reads data from a file,
filters that data and then writes the filtered output to another file. Typically, a specified
amount of data is passed to the filter in each loop iteration. The file reader object uses
a state to keep track of where in the file to begin the next data read. Likewise, the file
writer object keeps tracks of where it last wrote data to the output file so that data is not
overwritten. The filter object maintains its own internal states to assure that the filtering
is performed correctly. This diagram represents a single loop of the system.

Many System objects support:

• Fixed-point arithmetic (requires a Fixed-Point Designer™ license)


• C code generation (requires a MATLAB Coder™ or Simulink Coder license)
• HDL code generation (requires an HDL Coder™ license)
• Executable files or shared libraries generation (requires a MATLAB Compiler™
license)

Note: Check your product documentation to confirm fixed-point, code generation, and
MATLAB Compiler support for the specific System objects you want to use.

4-3
4 System Objects

In addition to the System objects provided with System Toolboxes, you can also create
your own System objects. See “Define System Objects”.

4-4
System Objects vs. MATLAB Functions

System Objects vs. MATLAB Functions


In this section...
“System Objects vs. MATLAB Functions” on page 4-5
“Process Audio Data Using Only MATLAB Functions Code” on page 4-5
“Process Audio Data Using System Objects” on page 4-6

System Objects vs. MATLAB Functions


Many System objects have MATLAB function counterparts. For simple, one-time
computations use MATLAB functions. However, if you need to design and simulate
a system with many components, use System objects. Using System objects is also
appropriate if your computations require managing internal states, have inputs that
change over time or process large streams of data.

Building a dynamic system with different execution phases and internal states using
only MATLAB functions would require complex programming. You would need code to
initialize the system, validate data, manage internal states, and reset and terminate
the system. System objects perform many of these managerial operations automatically
during execution. By combining System objects in a program with other MATLAB
functions, you can streamline your code and improve efficiency.

Process Audio Data Using Only MATLAB Functions Code


This example shows how to write MATLAB® function-only code for reading audio data.

The code reads audio data from a file, filters it, and then plays the filtered audio data.
The audio data is read in frames. This code produces the same result as the System
objects code in the next example, allowing you to compare approaches.

Locate source audio file.

fname = 'speech_dft_8kHz.wav';

Obtain the total number of samples and the sampling rate from the source file.
audioInfo = audioinfo(fname);
maxSamples = audioInfo.TotalSamples;
fs = audioInfo.SampleRate;

4-5
4 System Objects

Define the filter to use.


b = fir1(160,.15);

Initialize the filter states.


z = zeros(1,numel(b)-1);

Define the amount of audio data to process at one time, and initialize the while loop
index.
frameSize = 1024;
nIdx = 1;

Define the while loop to process the audio data in processloop.


type processloop

while nIdx <= maxSamples(1)-frameSize+1


audio = audioread(fname,[nIdx nIdx+frameSize-1]);
[y,z] = filter(b,1,audio,z);
sound(y,fs);
nIdx = nIdx+frameSize;
end

The loop uses explicit indexing and state management, which can be a tedious and error-
prone approach. You must have detailed knowledge of the states, such as, sizes and
data types. Another issue with this MATLAB-only code is that the sound function is not
designed to run in real time. The resulting audio is very choppy and barely audible.

Process Audio Data Using System Objects


This example shows how to write System objects code for reading audio data.

The code uses System objects from the DSP System Toolbox™ software to read audio
data from a file, filter it, and then play the filtered audio data. This code produces
the same result as the MATLAB® code shown previously, allowing you to compare
approaches.

Locate source audio file.


fname = 'speech_dft_8kHz.wav';

4-6
System Objects vs. MATLAB Functions

Define the System object to read the file.


audioIn = dsp.AudioFileReader(fname,'OutputDataType','single');

Define the System object to filter the data.


filtLP = dsp.FIRFilter('Numerator',fir1(160,.15));

Define the System object to play the filtered audio data.


audioOut = audioDeviceWriter('SampleRate',audioIn.SampleRate);

Define the while loop to process the audio data.


while ~isDone(audioIn)
audio = step(audioIn); % Read audio source file
y = step(filtLP,audio); % Filter the data
step(audioOut,y); % Play the filtered data
end

This System objects code avoids the issues present in the MATLAB-only code. Without
requiring explicit indexing, the file reader object manages the data frame sizes while the
filter manages the states. The audio device writer object plays each audio frame as it is
processed.

4-7
4 System Objects

System Design and Simulation in MATLAB


System objects allow you to design and simulate your system in MATLAB. You use
System objects in MATLAB as shown in this diagram.

1 Create individual components — Create the System objects to use in your system.
See “Create Components for Your System” on page 4-22. In addition to the
System objects provided with System Toolboxes, you can also create your own
System objects. See “Define System Objects”.
2 Configure components — If necessary, change the objects’ property values to model
your particular system. All System object properties have default values that you
may be able to use without changing them. See “Component Properties” on page
4-23.
3 Assemble components into system — Write a MATLAB program that includes those
System objects, connecting them using MATLAB variables as inputs and outputs to
simulate your system. See “Connecting System Objects” on page 4-25.
4 Run the system — Run your program, which uses the step method to run your
system’s System objects. You can change tunable properties while your system is
running. See “Run Your System” on page 4-27 and “Reconfiguring Objects” on
page 4-28.

4-8
System Design and Simulation in Simulink

System Design and Simulation in Simulink


You can use System objects in your model to simulate in Simulink.

1 Create a System object to be used in your model. See “Define New Kinds of System
Objects for Use in Simulink” on page 4-31 for information.
2 Test your new System object in MATLAB. See “Test New System Objects in
MATLAB” on page 4-36
3 Add the System object to your model using the MATLAB System block. See “Add
System Objects to Your Simulink Model” on page 4-37 for information.
4 Add other Simulink blocks as needed and connect the blocks to construct your
system.
5 Run the system

4-9
4 System Objects

System Objects in MATLAB Code Generation


In this section...
“System Objects in Generated Code” on page 4-10
“System Objects in codegen” on page 4-14
“System Objects in the MATLAB Function Block” on page 4-15
“System Objects in the MATLAB System Block” on page 4-15
“System Objects and MATLAB Compiler Software” on page 4-15

System Objects in Generated Code


You can generate C/C++ code in MATLAB from your system that contains System objects
by using MATLAB Coder. You can generate efficient and compact code for deployment in
desktop and embedded systems and accelerate fixed-point algorithms.

System Objects Code with Persistent Objects for Code Generation


function ex_system_codegen
% Find corresponding interest points between a pair of images using local
% neighborhoods.

% Declare System objects as persistent.


persistent colorSpaceConverter

% Initialize persistent System objects only once


% Do this with 'if isempty(persistent variable).'
% This condition will be false after the first time.
if isempty(colorSpaceConverter)

% Create system objects. Pass property value arguments as constructor


% arguments. Property values must be constants during compile time.

colorSpaceConverter = vision.ColorSpaceConverter('Conversion',...
'RGB to intensity');
end

% Declare functions called into MATLAB that do not generate


% code as extrinsic.
coder.extrinsic('imread');

% The output of an extrinsic function is an mxArray - also called a MATLAB

4-10
System Objects in MATLAB Code Generation

% array. To use mxArrays returned by extrinsic functions, assign the


% mxArray to a variable whose type and size is defined.
imgLeft = zeros([300 400 3],'uint8');
imgRight = zeros([300 400 3],'uint8');

% Call extrinsic function


imgLeft = imread('viprectification_deskLeft.png');
imgRight = imread('viprectification_deskRight.png');

% Convert RGB to grayscale


I1 = step(colorSpaceConverter,imgLeft);
I2 = step(colorSpaceConverter,imgRight);

% Find corners
points1 = detectHarrisFeatures(I1);
points2 = detectHarrisFeatures(I2);

% Extract neighborhood features


[features1, valid_points1] = extractFeatures(I1,points1);
[features2, valid_points2] = extractFeatures(I2,points2);

% Match features
index_pairs = matchFeatures(features1, features2);

% Retrieve locations of corresponding points for each image


matchedPoints1 = valid_points1.Location(index_pairs(:,1),:);
matchedPoints2 = valid_points2.Location(index_pairs(:,2),:);

% Visualize corresponding points


coder.extrinsic('showMatchedFeatures')
figure;
showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2);

For another detailed code generation example, see “Generate Code for MATLAB Handle
Classes and System Objects” in the MATLAB Coder product documentation.

Usage Rules and Limitations for System Objects for Generating Code
The following usage rules and limitations apply to using System objects in code
generated from MATLAB.

Object Construction and Initialization

• If objects are stored in persistent variables, initialize System objects once by


embedding the object handles in an if statement with a call to isempty( ).

4-11
4 System Objects

• Set arguments to System object constructors as compile-time constants.


• You cannot initialize System objects properties with other MATLAB class objects
as default values in code generation. You must initialize these properties in the
constructor.

Inputs and Outputs

• System objects accept a maximum of 32 inputs. A maximum of 8 dimensions per input


is supported.
• The data type of the inputs should not change.
• If you want the size of inputs to change, verify that variable-size is enabled. Code
generation support for variable-size data also requires that the Enable variable
sizing option is enabled, which is the default in MATLAB.

Note: Variable-size properties in MATLAB Function block in Simulink are not


supported. System objects predefined in the software do not support variable-size if
their data exceeds the DynamicMemoryAllocationThreshold value.
• Do not set System objects to become outputs from the MATLAB Function block.
• Do not use the Save and Restore Simulation State as SimState option for any System
object in a MATLAB Function block.
• Do not pass a System object as an example input argument to a function being
compiled with codegen.
• Do not pass a System object to functions declared as extrinsic (functions called in
interpreted mode) using the coder.extrinsic function. System objects returned
from extrinsic functions and scope System objects that automatically become extrinsic
can be used as inputs to another extrinsic function, but do not generate code.

Tunable and Nontunable Properties

• The value assigned to a nontunable property must be a constant and there can be at
most one assignment to that property (including the assignment in the constructor).
• For most System objects, the only time you can set their nontunable properties during
code generation is when you construct the objects.

• For System objects that are predefined in the software, you can set their tunable
properties at construction time or using dot notation after the object is locked.
• For System objects that you define, you can change their tunable properties
at construction time or using dot notation during code generation. For

4-12
System Objects in MATLAB Code Generation

getNumInputsImpl and getNumOutputsImpl methods, if you set the


return argument from an object property, that object property must have the
Nontunable attribute.
• Objects cannot be used as default values for properties.

Global Variables

• Global variables are allowed in a System object, unless you will be using that System
object in Simulink via the MATLAB System block. To avoid syncing global variables
between a MEX file and the workspace, use a coder configuration object. For example:

f = coder.MEXConfig;
f.GlobalSyncMethod = 'NoSync'
Then, include '-config f' in your codegen command.

Methods

• Code generation support is available only for these System object methods:

• get
• getNumInputs
• getNumOutputs
• isDone (for sources only)
• isLocked
• release
• reset
• set (for tunable properties)
• step
• For System objects that you define,

Code generation support is available only for these methods:

• getDiscreteStateImpl
• getNumInputsImpl
• getNumOutputsImpl
• infoImpl
• isDoneImpl

4-13
4 System Objects

• isInputDirectFeedThroughImpl
• outputImpl
• processTunedPropertiesImpl
• releaseImpl — Code is not generated automatically for the this method. To
release an object, you must explicitly call the release method in your code.
• resetImpl
• setupImpl
• stepImpl
• updateImpl
• validateInputsImpl
• validatePropertiesImpl
• Code generation support for using dot notation depends on whether the System object
is predefined in the software or is one that you defined.

• For System objects that are predefined in the software, you cannot use dot
notation to call methods.
• For System objects that you define, you can use dot notation or function call
notation, with the System object as first argument, to call methods.

System Objects in codegen


You can include System objects in MATLAB code in the same way you include any
other elements. You can then compile a MEX file from your MATLAB code by using
the codegen command, which is available if you have a MATLAB Coder license. This
compilation process, which involves a number of optimizations, is useful for accelerating
simulations. See “Getting Started with MATLAB Coder” and “MATLAB Classes” for
more information.

Note: Most, but not all, System objects support code generation. Refer to the particular
object’s reference page for information.

4-14
System Objects in MATLAB Code Generation

System Objects in the MATLAB Function Block


Using the MATLAB Function block, you can include any System object and any
MATLAB language function in a Simulink model. This model can then generate
embeddable code. System objects provide higher-level algorithms for code generation
than do most associated blocks. For more information, see “What Is a MATLAB Function
Block?” in the Simulink documentation.

System Objects in the MATLAB System Block


Using the MATLAB System block, you can include in a Simulink model individual
System objects that you create with a class definition file. The model can then generate
embeddable code. For more information, see “MATLAB System Block” in the Simulink
documentation.

System Objects and MATLAB Compiler Software


MATLAB Compiler software supports System objects for use inside MATLAB functions.
The compiler product does not support System objects for use in MATLAB scripts.

4-15
4 System Objects

System Objects Methods That Support Code Generation


In this section...
“Code Generation Supported System Objects Methods” on page 4-16
“Simulation-Only System Objects Methods” on page 4-16

Code Generation Supported System Objects Methods


Only the following methods are supported in code generation.

• getDiscreteStateImpl
• getNumInputsImpl
• getNumOutputsImpl
• isDoneImpl
• infoImpl
• isInputDirectFeedthroughImpl
• outputImpl
• processTunedPropertiesImpl
• releaseImpl — Code is not generated automatically for the this method. To release an
object, you must explicitly call the release method in your code.
• resetImpl
• setupImpl
• stepImpl
• updateImpl
• validateInputsImpl
• validatePropertiesImpl

Simulation-Only System Objects Methods


The following methods are for simulation only and do not support code generation.

• getDiscreteStateSpecificationImpl
• getHeaderImpl

4-16
System Objects Methods That Support Code Generation

• getInputNamesImpl
• getIconImpl
• getOutputDataTypeImpl
• getOutputNamesImpl
• getOutputSizeImpl
• getPropertyGroupsImpl
• isInactivePropertyImpl
• isOutputComplexImpl
• loadObjectImpl
• propagatedInputComplexity
• propagatedInputDataType
• propagatedInputFixedSize
• propagatedInputSize
• saveObjectImpl
• supportsMultipleInstanceImpl

4-17
4 System Objects

System Objects in Simulink


In this section...
“System Objects in the MATLAB Function Block” on page 4-18
“System Objects in the MATLAB System Block” on page 4-18

System Objects in the MATLAB Function Block


You can include System object code in Simulink models using the MATLAB Function
block. Your function can include one or more System objects. Portions of your system may
be easier to implement in the MATLAB environment than directly in Simulink. Many
System objects have Simulink block counterparts with equivalent functionality. Before
writing MATLAB code to include in a Simulink model, check for existing blocks that
perform the desired operation.

System Objects in the MATLAB System Block


You can include individual System objects that you create with a class definition file
into Simulink using the MATLAB System block. This provides one way to add your
own algorithm blocks into your Simulink models. For information, see “System Object
Integration” in the Simulink documentation.

4-18
System Object Methods

System Object Methods


In this section...
“What Are System Object Methods?” on page 4-19
“The Step Method” on page 4-19
“Common Methods” on page 4-20

What Are System Object Methods?


After you create a System object, you use various object methods to process data or
obtain information from or about the object. All methods that are applicable to an object
are described in the reference pages for that object. System object method names begin
with a lowercase letter and class and property names begin with an uppercase letter.
The syntax for using methods is <method>(<handle>), such as step(H), plus possible
extra input arguments.

System objects use a minimum of two commands to process data—a constructor to


create the object and the step method to run data through the object. This separation
of declaration from execution lets you create multiple, persistent, reusable objects,
each with different settings. Using this approach avoids repeated input validation
and verification, allows for easy use within a programming loop, and improves overall
performance. In contrast, MATLAB functions must validate parameters every time you
call the function.

These advantages make System objects particularly well suited for processing streaming
data, where segments of a continuous data stream are processed iteratively. This ability
to process streaming data provides the advantage of not having to hold large amounts of
data in memory. Use of streaming data also allows you to use simplified programs that
use loops efficiently.

The Step Method


The step method is the key System object method. You use step to process data using
the algorithm defined by that object. The step method performs other important tasks
related to data processing, such as initialization and handling object states. Every
System object has its own customized step method, which is described in detail on the
step reference page for that object. For more information about the step method and
other available methods, see the descriptions in “Common Methods” on page 4-20.

4-19
4 System Objects

Common Methods
All System objects support the following methods, each of which is described in a method
reference page associated with the particular object. In cases where a method is not
applicable to a particular object, calling that method has no effect on the object.

Method Description
step Processes data using the algorithm defined by the object. As
part of this processing, it initializes needed resources, returns
outputs, and updates the object states. After you call the
step method, you cannot change any input specifications (i.e.,
dimensions, data type, complexity). During execution, you can
change only tunable properties. The step method returns
regular MATLAB variables.

Example: Y = step(H,X)
release Releases any special resources allocated by the object, such
as file handles and device drivers, and unlocks the object.
For System objects, use the release method instead of a
destructor.
reset Resets the internal states of a locked object to the initial values
for that object and leaves the object locked
getNumInputs Returns the number of inputs (excluding the object itself)
expected by the step method. This number varies for an object
depending on whether any properties enable additional inputs.
getNumOutputs Returns the number of outputs expected from the step
method. This number varies for an object depending on
whether any properties enable additional outputs.
getDiscreteState Returns the discrete states of the object in a structure. If the
object is unlocked (when the object is first created and before
you have run the step method on it or after you have released
the object), the states are empty. If the object has no discrete
states, getDiscreteState returns an empty structure.
clone Creates another object of the same type with the same property
values
isLocked Returns a logical value indicating whether the object is locked.

4-20
System Object Methods

Method Description
isDone Applies to source objects only. Returns a logical value
indicating whether the step method has reached the end of
the data file. If a particular object does not have end-of-data
capability, this method value returns false.
info Returns a structure containing characteristic information
about the object. The fields of this structure vary depending on
the object. If a particular object does not have characteristic
information, the structure is empty.

For a complete list of methods for writing new System objects, see “System Objects
Methods for Defining New Objects”.

4-21
4 System Objects

System Design in MATLAB Using System Objects


In this section...
“Predefined Components” on page 4-22
“Create Components for Your System” on page 4-22
“Component Properties” on page 4-23
“Configure Component Property Values” on page 4-23
“Create and Configure Components at the Same Time” on page 4-24
“Connecting System Objects” on page 4-25
“Connect Components in a System” on page 4-25
“Run Your System” on page 4-27
“Reconfiguring Objects” on page 4-28
“Change a Tunable Property in Your System” on page 4-28

Predefined Components
The example in the next section shows how to use System objects that are predefined in
the software. If you use a function to create and use a System object, specify the object
creation using conditional code. This will prevent errors if that function is called within a
loop.

You can also create your own System objects (see “Define System Objects”).

Create Components for Your System


This section of the example shows how to set up your system. The predefined components
you need are:

• vision.VideoFileReader — Read the file of video data


• vision.AlphaBlender — Overlay edges onto the original video images
• vision.VideoPlayer — Play the video

The example uses a function for edge detection. First, create the component objects, using
default property settings. Create three VideoPlayer objects. One to play the original
video, one to play the edges, and one to show the edges overlaid on the original video.

4-22
System Design in MATLAB Using System Objects

hVideoSrc = vision.VideoFileReader;
hAB = vision.AlphaBlender;
hVideoOrig = vision.VideoPlayer;
hVideoEdges = vision.VideoPlayer;
hVideoOverlay = vision.VideoPlayer;

Component Properties
When to Configure Components

If you did not set an object's properties when you created it and do not want to use
default values, you must explicitly set those properties. Some properties allow you to
change their values while your system is running. See “Reconfiguring Objects” on page
4-28 for information.

Most properties are independent of each other. However, some System object properties
enable or disable another property or limit the values of another property. To avoid
errors or warnings, you should set the controlling property before setting the dependent
property.

Display Component Property Values

To display the current property values for an object, type that object’s handle name at
the command line (such as audioIn). To display the value of a specific property, type
objecthandle.propertyname (such as audioIn.FileName).

Configure Component Property Values


This section of the example shows how to configure the components for your system by
setting the component objects’ properties.

Use this procedure if you have created your components separately from configuring
them. You can also create and configure your components at the same time, as described
in a later example.

For the video file reader object, specify the file to read and set the image color space.

For the alpha blender object, specify the type of operation to use.

For the video player objects, specify the names, the window size, and the window
position.

4-23
4 System Objects

hVideoSrc.Filename = 'vipmen.avi';
hVideoSrc.ImageColorSpace = 'Intensity';

hAB.Operation = 'Highlight selected pixels';

WindowSize = [190 150];

hVideoOrig.Name = 'Original';
hVideoOrig.Position = [10 hVideoOrig.Position(2) WindowSize];

hVideoEdges.Name = 'Edges';
hVideoEdges.Position = [210 hVideoOrig.Position(2) WindowSize];

hVideoOverlay.Name = 'Overlay';
hVideoOverlay.Position = [410 hVideoOrig.Position(2) WindowSize];

Create and Configure Components at the Same Time


This section of the example shows how to create your System object™ components and
configure the desired properties at the same time. Specify each property with a 'Name',|
Value| argument pair.

For the video file reader object, specify the file to read and set the image color space.

For the alpha blender object, specify the type of operation to use.

For the video player objects, specify the names, the window size, and the window
position.

hVideoSrc = vision.VideoFileReader('vipmen.avi', ...


'ImageColorSpace', 'Intensity');

hAB = vision.AlphaBlender('Operation', 'Highlight selected pixels');

WindowSize = [190 150];


hVideoOrig = vision.VideoPlayer('Name', 'Original',...
'Position',[10 100 WindowSize]);

hVideoEdges = vision.VideoPlayer('Name', 'Edges',...


'Position',[210 100 WindowSize]);

hVideoOverlay = vision.VideoPlayer('Name', 'Overlay',...


'Position',[410 100 WindowSize]);

4-24
System Design in MATLAB Using System Objects

Connecting System Objects


After you have determined the components you need and have created and configured
your System objects, assemble your system. You use the System objects like other
MATLAB variables and include them in MATLAB code. You can pass MATLAB variables
into and out of System objects.

The main difference between using System objects and using functions is the step
method. The step method is the processing command for each System object and is
customized for that specific System object. This method initializes your objects and
controls data flow and state management of your system. You typically use step within a
loop.

You use the output from an object’s step method as the input to another object’s step
method. For some System objects, you can use properties of those objects to change the
number of inputs or outputs. To verify that the appropriate number of input and outputs
are being used, you can use getNumInputs and getNumOutputs on any System object.
For information on all available System object methods, see “System Object Methods” on
page 4-19.

Connect Components in a System


This section shows how to connect the components together to read the file, detect edges,
form a composite image, and display the video data. The while loop uses the isDone
method to read through the entire file. The step method is used on each object inside the
loop.

while ~isDone(hVideoSrc)
frame = step(hVideoSrc); % Read input video
edges = edge(frame,'Prewitt',15/256); % Edge detection
composite = step(hAB, frame, edges); % AlphaBlender

step(hVideoOrig,frame); % Display original


step(hVideoEdges,edges); % Display edges
step(hVideoOverlay,composite); % Display edges overlaid
end
release(hVideoSrc);

4-25
4 System Objects

4-26
System Design in MATLAB Using System Objects

Run Your System


How to Run Your System

Run your code either by typing directly at the command line or running a file containing
your program. When you run the code for your system, the step method instructs each
object to process data through that object.

What You Cannot Change While Your System Is Running

The first call to the step method initializes and then locks your object. When a System
object has started processing data, it is locked to prevent changes that would disrupt its
processing. Use the isLocked method to verify whether an object is locked. When the
object is locked, you cannot change:

• Number of inputs or outputs


• Data type of inputs or outputs
• Data type of any tunable property
• Dimensions of inputs or tunable properties, except for System objects that support
variable-size data
• Value of any nontunable property

To make changes to your system while it is running, see “Reconfiguring Objects” on page
4-28.

4-27
4 System Objects

Reconfiguring Objects
When Can You Change Component Properties?

When a System object has started processing data, it is locked to prevent changes that
would disrupt its processing. You can use isLocked on any System object to verify
whether it is locked or not. When processing is complete, you can use the release
method to unlock a System object.

Some object properties are tunable, which enables you to change them even if the object
is locked. Unless otherwise specified, System objects properties are nontunable. Refer
to the object’s reference page to determine whether an individual property is tunable.
Typically, tunable properties are not critical to how the System object processes data.

Change Input Complexity or Dimensions

During simulation, some System objects do not allow complex data if the object was
initialized with real data. You cannot change any input complexity during code
generation.

You can change the value of a tunable property without a warning or error being
produced. For all other changes at run time, an error occurs.

Change a Tunable Property in Your System


You can change the threshold value as your code is running by modifying an object
property. This example modifies the Location property of the AlphaBlender object.
The change takes effect the next time the step method is called (in this case, at the next
iteration of the while loop).

while ~isDone(hVideoSrc)
frame = step(hVideoSrc); % Read input video
edges = edge(frame,'Prewitt',15/256); % Edge detection
composite = step(hAB, frame, edges); % AlphaBlender

hAB.Location(1) = hAB.Location(1)+1; % Offset edges


if (hAB.Location(1)==120)
hAB.Location = [1 1]; % wrap
end

step(hVideoOrig,frame); % Display original

4-28
Exploring the Variety of Random
Documents with Different Content
"I'll take my leave now. I've seen you, and that's enough for one
afternoon!"
She hissed out the words and rolled her dark eyes unpleasantly on
the sweet young English face. "There will be a second meeting, or
my name's not Leila Baltus! A Friendlee Society, forsooth!" Her
cheap skirt with its papery rustle swished along the floor as she
made her exit.
A disapproving murmur ran through the ranks of the loyal partisans,
but the incident was soon forgotten amid the pleasant preoccupation
over the trip on the following morning.
On Hester's mind, however, it left an unpleasant recollection. She
hoped the mutinous intruder might prove more amenable to Mrs.
Fellowes' influence at some future time, and that they might one day
be able to get nearer to this embittered-looking girl with the
beautiful eyes. To have had such a bellicose element in to-morrow's
party would have been jarring, to say the least of it, and unfair to
the others. It was doubtless hearing of the pleasure which she was
not to share, however, that had made the girl so rude and
unmannerly. Noting her name in her pocket-book, Hester resolved to
consult with her wise friend what should be their attitude towards
Miss Leila Baltus.
The bungalow where Mrs. Fellowes was staying belonged to an old
and distinguished firm of Madras merchants. The principals of the
firm had used it on occasion as a country house before South Indian
hills became so easy of access; and often now they put it at the
disposal of friends. To many a young couple had Binny's Bungalow at
Ennore proved a place of dear romance; to many a weary veteran a
haven of quiet rest.
There was a peculiar fairyism about Ennore. It seemed to nestle in
all its sylvan beauty on the borders of an inland lake whose slopes
were fringed by cocoanut palms, dense glossy shrubs, and
odoriferous spice plants; while graceful bamboos flung their
interlacing tendrils all about. Great water-lilies spread themselves
over the surface of the water, and the water-fowl floated or skimmed
over its sparkling ripples. A trim, white-sailed boat, with an ancient,
white-bearded serang in attendance, was always at the disposal of
the bungalow guests. Afloat on the placid waters of the lake and
sheltered by its leafy borders, every object tended to convince one
that it was entirely an inland sheet of water, till suddenly you might,
perchance, be startled by the shrill cry of a sea-gull, or the fierce roll
of the near breakers would fall on your astounded ear. You would
then glance across the sunny ripples of the lake, and perceive with
amazement that a strip of sand was all that divided the peaceful
backwater from the great Bay of Bengal; so white and thin were its
grains that they might be put through an hour-glass without
refinement, and so narrow was the strip that, in a minute, a child
could run across it. On one side light zephyrs dance on the tiny
ripples; on the other, the waters roll in mighty waves dashed to the
shore in tossing, writhing floods of whitest foam.
At the upper end of this long stretch of smooth sand stands the
gallant little bungalow with its trim, green-painted persiennes,
trellised verandahs, and its breezy "up-stair" room, surrounded by
some sturdy date palms, and sheltered from the elements by a belt
of hardy jungle trees which break the fury of the gales.
The one ample sitting-room of the bungalow from which branched
various bedrooms and dressing-rooms, seemed to Hester the most
English-looking room of a certain type which she had seen since
coming to the East. Perhaps it suggested the old-fashioned inn-
parlour more than anything intimately domestic. On its walls hung
numerous quaint-coloured prints of English hunting scenes. Its
sofas, planted against the walls, offered luxurious rest; while its big
dining-table and rows of chairs gave it a hospitable air. The many
windows at each end of the long room disclosed impartially the
inland beauties of the backwater, and the expanse of the great
restless ocean. On one side of the building the favoured small
guests, who found themselves making holiday at the bungalow,
might float their mimic ships in safety; and on the other, beyond the
mass of seething foam, the stateliest ships of the world might be
seen sailing over the great deep.
Hester had driven out early to help Mrs. Fellowes with preparations
for her numerous guests, and now stood by the side of the hostess,
giving the girls a smiling welcome to Ennore. It soon proved that the
prearranged programme for their entertainment was superfluous, so
charmed were the guests with the unwonted surroundings in which
they found themselves. Some groups sought the long narrow strip of
sunlit sand by the "many dashing ocean shore," to search for the
rare shells to be found there, thrown up by the tide, retreating with
shrieks of laughter when the curling waves dashed their spray upon
them. Others were more fascinated by the peaceful charm of the
backwater, and made expeditions in the boat to the further end of
the lake, bent on securing trophies of greenery for the decoration of
their dull Vepery parlours. The white-haired, nut-brown serang had
many freights of passengers that day, and more than one
sensational shriek reached the ladies who sat in the verandah
watching all the ongoings.
A plentiful tiffin brought the guests indoors for a time, but they were
eager to be out again, even under the hot afternoon sun, to explore
the sylvan brakes or saunter on the sunny sands.
"Do you know, Mrs. Fellowes," said Hester, "I begin to feel rather an
impostor! I told myself that I must come to-day to help you to
entertain your guests, and now I find I'm doing nothing but hugely
enjoying myself!"
She lay back happily in one of the luxurious teakwood arm-chairs
which were a special and memorable feature of the verandah.
"Well, my dear, I'm only too glad you are having a nice rest,"
returned Mrs. Fellowes, glancing at her with a kindly smile. "I
thought you looked rather jaded and worried when you arrived, but
this air is wonderfully soothing and restoring."
"I confess I was rather worried last night," said Hester, with a sigh.
"How would you act if you were suddenly presented with a costly
gift by your husband which you neither admired nor wished?" she
asked, deciding she would take counsel of the woman Mr. Morpeth
called a "wise saint." She proceeded to tell her of the difficulty she
felt when suddenly confronted with the gorgeous diamond pendant
in its elegant case and been asked to accept this distasteful gift, and
what her attitude had been.
"Oh, my dear, I do think such a prompt refusal was a little bit rough
on your husband, though I sympathise with you in the main, for I
know you don't care for jewels. But these matters must be handled
very delicately. For instance, I think if Joe had taken it into his head
to present me with something he would be much hurt if I declined to
accept his offering; but then, to be sure, it would not be a costly gift
as yours is——"
"Diamonds of the first water, Alfred described them," said Hester,
shaking her head.
"Why, they must have cost a fortune! But your husband is no doubt
able to afford them—he must be a very rich man."
A knot rose in Hester's throat. Since her husband was so
demonstratively rich, why had he so irritatingly declined the little
boon which she had craved? Good taste and loyalty forbade her
sharing with her friend the main source of her discomfort in having
had the costly gift pressed upon her. Mrs. Fellowes, however,
perceived that she was deeply perturbed concerning the incident,
but she felt she could not encourage Hester to persevere in her
determination to have the pendant returned. That course would
certainly have the effect of widening the little rift which seemed
already vibrating.
"Just you ask your husband to put the jewel in his safe to keep it
from thieves, and, when it is stowed away like that, you will both
forget to give it an airing, and you won't have to bedeck yourself
with it."
"A capital idea! That will please Alfred, and will save me more words
about the matter."
"Only," Mrs. Fellowes added, "you might stipulate that in future your
husband's affection would be more valued if it did not take the form
of costly gifts. Your husband must be very rich," repeated Mrs.
Fellowes, this time with an interrogative note in her voice and a
glance at Hester. "Young barristers out here are seldom able to
present their wives with diamonds of the first water."
"No, I don't think Alfred is what could be called rich. But you know
he has an addition to what he earns—an allowance from his people.
I forget how much it is, but he told father. Both his parents died
when he was a baby, and an aunt and her husband brought him up.
His uncle Rayner had been in the same firm as his father, and I think
Alfred has still a share in the business, but I don't interest myself in
these matters. I have a very unbusiness-like mind," she added with
a sigh. "I'm afraid my husband thinks me quite hopeless in that
department, though I am vain enough to believe that I could now
manage the domestic side better—at least more economically—than
he does."
"But you do, don't you? Why, when the Colonel and I dined with you
lately I recollect one of Mr. Rayner's bachelor friends said chaffingly:
'It's easy to see your Eve's hand in this Paradise, Rayner!' And I
remember I quite loved your husband when I heard him say with an
air of glee, 'Yes, isn't she a splendid housekeeper?'"
"A splendid housekeeper! Oh, Alfred must have been joking! I only
wish he would let me have a try! Of course everything was very new
and strange to me at first, but I've found my way about in many
things now. I'm no more an absolute 'griffin.' For one thing, I'm
quite sure I could manage much more economically than we're
doing now. Alfred admits we are spending a great deal——"
Hester's voice faltered as she recalled the humiliating context in
which he had made the unexpected admission.
"Well, my dear, look here," said Mrs. Fellowes in an emphatic tone,
after a little silence. "As the price of your concession in keeping the
diamonds, suppose you stipulate for a freer hand on the
housekeeping reins, especially since your husband admits that these
expenses are large. I would strongly advise you to arrange this."
Mrs. Fellowes called to mind the Colonel having more than once
remarked that the young Rayners must be spending lacs between
horse-flesh and elegant dinners. She felt glad that this talk had given
her the opportunity of offering some advice on the subject to the
young wife whom she had come to admire and love for other
qualities than merely her personal charm.
The bright day had faded. That magical, and, in Eastern lands,
momentary interval between light and darkness had fallen. The girls
were at length gathered in the brightly-lit sitting-room, having an
evening meal before starting on their homeward way. Their cheerful
faces and happy laughter told how greatly they had enjoyed their
day.
"We've just been awfulee happy," said one spokeswoman. "'Twill be
a tale to tell for many a day in Vepery!"
"And won't thatt cat, Leila Baltus, be spiteful when she hears wot a
good time we've had, and her kept out," remarked another.
"Oh, but that is not a kind source of satisfaction, Rosa," said Mrs.
Fellowes, looking at the girl, and shaking her head in gentle
disapproval. "Who is Leila Baltus?" she asked in an undertone,
turning to Hester; but the question was unheard in the general
bustle of departure.
The last carriageful was now driving off, and a shrill chorus of
expressions of gratitude mingled with the sea sounds which were
more audible now that the darkness had fallen. Long afterwards
Hester remembered this night, and conjured up a vivid picture of
this shore of the Bay of Bengal, the sweet placid face of the "wise
saint," the eager groups of amber-faced girls with the evidence of a
happy innocent day written on every feature, and the background of
the brightly-lit parlour, while a stone's throw away rolled the
darkened waters of the great restless ocean.
Hester, in her husband's absence, had agreed to remain the night
with her friend. Colonel Fellowes appeared presently, having driven
out to see his wife, and a pleasant evening followed. When Hester
mounted the narrow staircase to the delightful bedroom assigned to
her on the flat roof, she felt it was long since such an entirely happy
day had been her portion. With its many doors opening on the leads,
this room was an abode of luxury on hot Indian plains. Here no
drowsy punkah-wallah had to be roused by the sleepless victim to
pull the weary wind-fan! The sea breeze wooed one to sleep even
on the hottest nights, and through the many doors open to the dark
blue vault, one could lie in bed and watch the stars come out,
tracing whole constellations from one's downy pillow to the music of
the wild waves.
CHAPTER XVI.
On the same afternoon as Hester was enjoying the many-sided
pleasures of her day at Ennore, Alfred Rayner was stepping from the
train at the trim little railway station of Puranapore. He looked less
brisk than ordinarily, and did not seem disposed to claim the
simultaneous attentions of all the native officials in his usual self-
assertive manner, but stood glancing up and down the platform with
an undecided air. In fact the green flag had been waved, and the
train by which he had arrived had started on its onward way, but still
he seemed in no hurry to proceed. Presently the station-master
approached him, and salaaming, inquired which Dorai he was on his
way to visit, no carriage having appeared from the English
cantonment.
Mr. Rayner was in a very uncommunicative mood. He did not
disclaim any purpose of visiting one of the English residents, nor did
he indicate whither he was bound. Suddenly he picked up his bag,
for on second thoughts he had dismissed his dressing-boy at the
Madras station, and strode off on foot, much to the surprise of the
station-master, who was a comparative stranger and did not even
know him by sight. The scowling Hindu ticket-collector quickly
enlightened him.
"That's La'yer Rayner that done bobbery about that mosque," he
remarked, and proceeded to denounce the barrister in no flattering
terms, prophesying that he had reappeared to hatch fresh mischief
with the plotting Zynool.
The object of these unfavourable comments was meanwhile making
his way among the narrow crowded streets of the old town, and in
one of the unloveliest of these he stood glancing up at a house, the
front aspect of which was little more than a blank wall, its peeling
chunam giving it a dreary, weather-stained appearance. Its few slits
of windows looked down on the street like pairs of suspicious eyes,
and its low door seemed as if it could not admit anyone of even
average stature, though it gave daily ingress and egress to the
ponderous figure of Zynool Sahib. At this low portal Mr. Rayner
stood, tentatively looking up at the narrow windows.
"Perhaps I should have wired to announce my coming! One never
knows whether an impromptu descent or not is best with these
beggars. If I had warned Zynool, it would only have given him a
loophole for escape if he had a mind for any reason to dodge me.
His letter showed he was mad over his failure to annex that idiot,
Cheveril, and he seemed actually to blame me for it!"
He had ample time for his soliloquy while he waited for a response
to his knock. At length he heard the withdrawing of heavy bolts
within and the door was opened. On his inquiry if Zynool Sahib was
at home, a suspicious-looking servant led him along a dark, narrow
passage from which he passed into a courtyard ablaze with sunshine
and gay with flowering shrubs. In the centre a fountain played and
goldfish disported themselves in its sparkling basin. Rows of
windows with leaded panes of glass looked into the court, some of
these were being hurriedly closed now, though the visitor was able
to catch a glimpse of moving forms within and even of faces peering
furtively down upon him.
"The harem, of course," muttered Mr. Rayner, with a scornful smile.
"No, ladies, you need not fear, I'll not peep, I've no wish to anger
your lord and master!"
After a little pause another servant appeared; he was evidently of a
higher grade, for he pushed the other aside rudely, saying:
"Your honour will follow me! The Sahib will see!"
The visitor was led along more passages and finally shown into a
large room furnished entirely after English fashions of an unrefined
sort. The badly stuffed sofa and chairs covered with crimson plush
looked most uninviting. On the floor was spread a crude coloured
Brussels carpet, while lovely Persian rugs lay huddled on the
verandah outside. The only ornament in the room was a huge
musical box.
"So this is Zynool's idea of comfort! I wonder what Hester would
think of this," muttered Mr. Rayner, flinging his sun-topee on the
garish plush table-cloth, its neutral colour giving a relieving touch
which he noted almost with comfort as he seated himself on the
hard sofa. He had never before penetrated into Zynool's home,
having most frequently arranged meetings with him in Madras, or,
when business necessitated a visit to Puranapore, Zynool had always
directed him to a room near the railway station which seemed at his
disposal.
Presently the heavy curtain at the other end of the room from which
he had entered was pushed aside by a fat brown hand bedecked
with sparkling rings, and the master of the house stood before him,
making less deferential salaam than usual, and with a frown on his
face. Rayner also discerned from a certain flicker of his eyelids which
half covered his beady eyes that Zynool was not in the best of
tempers.
"Worse luck for me," he groaned inwardly.
"You give your humble slave one surprise, La'yer Rayner," said
Zynool, licking his coarse red lips, as he disposed his heavy person
on the edge of one of the plush-covered chairs. "No chit, no wire, no
nossing!" he jerked, looking querulously at his visitor as he spoke.
"Upon my word, Zynool, I ought to apologise for my coming upon
you in this unceremonious manner," returned Mr. Rayner, assuming
his most conciliatory tone, "but we're such friends, you and I, I
thought I might risk an impromptu visit. What a beautiful room you
have here—quite English, I declare!"
"Ha, it pleases your Honour then!" said Zynool, visibly brightening.
"This apartment has just been lately furnished all from Oakes &
Company, Madras,—all perfect English—Oakes' man done assure.
The carpet too, is it not a beautee?" he added, casting an admiring
glance on the hideous tints.
"Perfectly lovely—such good taste! A lucky man you are, Sahib, to be
able to order all these things—and to pay for them too!"
Here Mr. Rayner gave an ostentatious sigh which, however, was lost
on his host, who seized the opportunity of giving vent to a rankling
grievance.
"Yes, it was in your humble slave's heart to invite your friend, the
new Assistant-Collector, to come and have coffee in this lovelee
English room, and also to bestow many favours on that young man
till he scorned me in such wise as I made known to your Honour in
my chit. I expressed to your ear how his treatment was like hot
charcoal thrown in my face."
"Yes, very ungrateful on Cheveril's part! But you must bear in mind,
Sahib, that he's only a griffin, not an old diplomat like you. You may
find him more promising next time. You and he and I will be drinking
coffee together in this beautiful room, yet—take my word for it," said
Mr. Rayner, in an encouraging tone as he eyed the Mahomedan
closely.
"Nevere," replied Zynool, with a groan. "That one is not like Dorai
Printer. I take measure of that young man, veree quick. No favour
for your humble slave in that compound."
"Oh, you never can tell! And now I'll make a confidant of you,
Zynool. That young man is a very particular friend of my lady. He will
be coming to see us in Madras very soon. I shall not fail to tell him
what a splendid fellow you are, and what a loyal servant of the
Empire, and of the lovely English room you have here," Rayner
continued, keeping his eye on the heavy face to watch the effect of
his words, for he had a matter important to transact which had
brought him to Puranapore, though it was not pressing legal
business as he had indicated to his wife.
"The young man is a friend of your lady, say you? That is good!
Then, La'yer Rayner, the road is straight. Your mem-sahib must
doubtless do your Honour's will?" suggested Zynool, with an ugly
leer.
Not having an evasive reply ready on the tip of his tongue, Rayner
again applied himself to admiring his gaudy surroundings, though he
almost regretted his recurring to the topic, when Zynool began to
rub his fat hands gleefully, saying:
"But this is not the only English room I have on my premises. Come
and see!" and drawing aside the portière he disclosed a bedroom,
where a shiny new brass bedstead of the commonest order stood,
surrounded by the regulation furnishings. "This, too, all from Oakes
& Company, Madras, quite English and veree costlee"; and he
rubbed his hands in childish glee as he gazed about on his
possessions.
"By Jove, what a grand bed, I've a mind to repose on it," exclaimed
Rayner, with well-simulated admiration.
"And would your Honour realee do your humble slave the joy of
taking repose on thatt bed this veree night? If so, all can be
arranged and quicklee too," cried Zynool with enthusiasm.
Mr. Rayner was considerably taken aback by the proposal to sleep in
a native house. He had intended to travel a station or two down the
line when he had finished his business with the Mussulman, and put
up at the bungalow of a bachelor friend. But this eager offer of
hospitality was not to be lightly refused, following as it did Zynool's
irate mood, and he decided that prudence demanded a gracious
compliance with the request.
Zynool, obviously delighted with the success of his suggestion,
hurried off, all importance, to make arrangements for the
entertainment of the English guest. The news instantly circulated
from basement to house-top that the English sahib was to honour
the house of his client, though half-an-hour previously his arrival had
seemed to incense its master, and make confusion throughout the
household.
Mr. Rayner's relations with the Mussulman had been of more than
two years' standing. In fact Zynool Sahib had been one of the young
barrister's earliest clients, and owing to Rayner's astuteness and
daring he had been piloted round at least one ugly corner. If the
truth must be told, since then the lawyer had more than once thrust
his client into hot water. The pair had taken shares together in
various doubtful ventures, at Rayner's instigation, encouraged by
high interest, and had been markedly unsuccessful, so that when
Zynool informed him that a really good investment was going a-
begging in the shape of a piece of land in Puranapore, Rayner lent a
ready ear. The land being the property of a Hindu, Zynool explained
that he must keep entirely in the background, but was eager, for
reasons of his own, to aid the purchase by underhand methods. The
result was that the land in question became the property of Alfred
Rayner, to pass shortly after into the hands of the Moslem
community for double the price which the lawyer gave for it. Thus
the mosque which was now such a bone of contention came into
being, growing with the rapidity of Jack's beanstalk. Before the
Hindus began to realise what a perpetual source of annoyance it was
likely to prove, the Mahomedans were shouting their morning and
evening prayer-calls from its jerry-built minaret. Zynool rubbed his
fat hands with joy at the success of his plot to snub the Hindus,
while Rayner's bag of rupees for the price of the site was a godsend
to him, and had tided him through many months. But these ill-
gotten gains had all melted away during the past season's
extravagances. More serious still, the shares, which had seemed so
promising, were threatening to pay no further dividends, and calls
were looming in the distance. It was this black outlook which had
brought the young lawyer to the house of the Mahomedan this
afternoon, not indeed to announce to his client the threatened
failure of their joint investments—that, he decided, must be kept in
the dark—but to see whether he could negotiate a much needed
loan on easier terms than those of the Madras soukars. He
considered it therefore worth the odiousness of being condemned to
spend an evening in the crimson plush drawing-room and the
discomfort of a night in the shining brass bedstead, if he could work
his host up to that pitch of smiling compliance which would make his
request an easier task than it seemed likely to be during the first few
minutes of his call.
It was, however, with the cheque for five thousand rupees in his
pocket-book, albeit with even a greater loss of self-respect than his
dealings with the wily Mussulman had hitherto engendered, that
Alfred Rayner stepped out at the low doorway in the weather-
stained wall next morning. His host had ordered his gaudy little
chariot to be in readiness to drive him to the railway station. It
waited now as Zynool stood salaaming on the narrow pavement.
As Mr. Rayner was stepping into the carriage he caught sight of two
Englishmen passing along the head of the street. They walked
slowly. One was a short, broad-shouldered man, who was
endeavouring to hold a white-covered umbrella over the head of his
younger and taller companion as they laughed and chatted together.
"There goes Dr. Campbell, mine enemee," said Zynool, with a fierce
scowl, "and the osser is that haughtee young man. What a pity he
did not see your Honour at the house of your humble slave here," he
added, with an air of disappointment.
Rayner had retreated into the depths of the bandy before he
ventured to make any reply.
"So that's Dr. Campbell, is it? Not a very formidable looking person! I
should say, Zynool, that you're a match for that little man with the
hollow chest," he said, with a careless laugh as he settled himself
among the cushions, while Zynool's dark face filled the window.
Rayner was longing to ask him the question which he was anxiously
asking himself. "Had Mark caught sight of him at the Mussulman's
door?" He fervently hoped not, and made an absent, formal salaam
as he took leave of his host.
He congratulated himself that the two gentlemen, being on foot,
were probably going to the dispensary while their carriage waited
near, and that there would be no risk of his meeting them. He was
therefore not a little chagrined when the first person he saw
standing on the platform was the Assistant-Collector.
Perceiving that an encounter was inevitable, Rayner went forward
with a gracious smile.
"Who would have thought of seeing you here, Cheveril!"
"Why, I should rather say, who would have thought of seeing you at
our little Puranapore," responded Mark, with that direct look in his
eye which had already annoyed Rayner more than once.
"To a dead certainty he saw me at Zynool's door," thought Rayner,
who replied lightly, "Business, sir, business! Trying to get that fellow
Zynool to pay up what he owes me. He happened to be one of my
Puranapore clients before my last furlough. We barristers don't
always get paid in advance, I assure you!"
Mark recalled with discomfort Mr. Worsley's remark as to Zynool
having been helped by a "shady pleader," but he was glad to dismiss
the topic for the present by polite enquiries after Mrs. Rayner.
"Oh, Hester is as fit as a fiddle! Going in for no end of dissipation,
and still keeps her English roses," her husband replied briskly. "Come
and see for yourself, Cheveril! My wife was a bit disappointed that
you declined all our invitations."
"Please tell Mrs. Rayner that I have not been a day absent since I
joined, or I should have taken a run to Madras to see my friends
there."
"Yes, I believe the Collector is rather of the slave-driving order.
Between touring and office work he grinds his subs. pretty hard—so
Printer used to tell me."
"That's not a fair representation by any means," said Mark quickly.
"Touring and office work are both in the day's routine, and I like
both."
"Lucky man," said the lawyer, with more honest conviction than his
words generally implied as he glanced half enviously, half admiringly,
at the strong, reliant face of the young civilian which told of faithful
days and peaceful nights.
"Oh, by the way, Rayner, let me introduce you to our doctor! He is
taking a run to Madras to see a case he has in the hospital there.
You'll enjoy Campbell's talk. He's an awfully bright fellow," Mark
added, thinking that such an acquaintance might be salutary for this
shifty looking man. He was glancing round in search of the doctor
whom he saw talking to a Hindu official.
"Oh, thanks, no," replied Rayner, with a shrug of his shoulders. "I've
got a brief to study in the train. I must deny myself the pleasure of
Dr. Campbell's acquaintance."
He was about to hurry off to take his seat when he remembered that
he had made no definite arrangement concerning the suggested visit
to Clive's Road. "You'll come and put up with us for Christmas, of
course, Cheveril? It will be Hester's first Christmas here as well as
yours—jolly to spend it together! Shall I tell her of the pleasure in
store?"
"I'm certainly counting on seeing Mrs. Rayner then. Do please say so
with all kind words from me. But I shall be putting up at the Club.
Mr. Worsley has asked me to be his guest there, and to help him to
entertain a friend he expects to arrive then."
"Ah, well, one must keep on the right side of one's chief, of course.
You're a shrewd man, Cheveril! I'll be able to assure your friend
Hester that you're shaping-in beautifully. At all events you'll give us
one evening at Clive's Road?"
Mark cordially assented and turned away to make a parting salute to
the doctor as the train was moving off.
CHAPTER XVII.
Hester awaited her husband's return home with some uneasiness.
She wondered how he would receive the disclosure that the day at
Ennore was an accomplished fact. Being neither secretive nor
wanting in courage, she would have much preferred to have
explained previous to the expedition that she had felt obliged to
negotiate about the carriages, and had already paid for their hire.
She was therefore pleasantly taken by surprise on the morning after
Mr. Rayner's return, when they sat together at early tea under the
shade of the banyan tree, when he suddenly turned to her with a
penitent air, saying:
"Look here, Hester, I behaved abominably about the hire of those
bandies for your protégées. Forgive my hasty temper, sweet wife,
and as a proof of your full forgiveness accept this." He stooped
down to kiss her and laid a crisp note in her hand.
"A hundred rupees! Oh, Alfred, but that's a fortune—much more
than the cost of the carriages! You remember the hire was only to
be seventy-five rupees—and they're paid. Even the bill has been
filed. The first on the little file mother slipped into the netting of my
portmanteau! 'The only way to keep accounts straight is to use
these,' she said. And it does give one a sense of satisfaction when
one slips the bill into the file 'Paid!'"
"Oh, well, as to that, there's no sense in wishing to pay one's bills
before they're a day old—that doesn't pay, in fact! Tradesmen reckon
on their bills clinging to the file 'unpaid' for some time, and charge
accordingly. But as far as the present trifle is concerned it doesn't
matter. As to the surplus—the extra twenty-five rupees—keep them
for chiffons, my dear!"
"I know well what I want to do with every anna of my treasure
trove! You haven't asked how I came to have money to pay for the
carriages, Alfred! It was really the remains of a little store of
sovereigns in my dressing-case; I've been hoarding it for Christmas
presents to send home, and now, like the story of the widow's cruise
of oil, it has multiplied. I shall be able to send for those alluring
hawkers. I've always tried to turn away my eyes from beholding
their wares when they spread them out on the verandah, conscious
that I wasn't an intending customer."
"Oh, but you needn't be so sensitive! They don't in the least mind as
long as they are allowed to spread them on the verandah. But if you
really want the hawkers you'd better give orders to Veeraswamy to
summon the crew and have a bargaining. Mind, about half they ask
is the real value of the article. I expect you'll get dreadfully imposed
on."
"I hope not, for I'm anxious to get the worth of every rupee. There
are so many to send to. I must find something for father, though
that won't be so easy. About mother, I'll have no difficulty. But,
Alfred, is there nobody you want to send a Christmas-box to in the
homeland?" asked Hester, with kind eyes resting on her husband.
"Oh, no doubt there are sundry who would accept one with
pleasure. But you know, I'm a relationless being, Hester. Now that
Aunt Flo is gone, there isn't a soul belonging to me. It's better than
having undesirable relatives, isn't it? What a horror that would be, to
be sure! But I'm glad you've thought of the Rectory people. I owe
them heaps, Hester, for having allowed me to carry off the only
daughter of the house—and such a daughter! And you're having a
good time, are you not, dearest? Young Stapleton was just
remarking the other day at the Club that you were the prettiest and
most popular bride of the season. I'm so glad you're such a glorious
success," he added, taking her hand caressingly, and raising it to his
lips. "I'm going to write to your mother one day soon, and tell her
how well her transplanted English rose is doing here!"
"Don't boast about me in that strain, Alfred! It would not be
convincing to mother, though I know she'd love to have a letter from
you. But that nonsense of young Stapleton's, for instance, she would
positively dislike," returned Hester with decision, for she was eager
to prevent this husband of hers, whom her father half in fun
maintained to be still "an unknown quantity," from betraying any
trace of the curious little selfish vanity concerning his own
possessions, simply because they were his, which he was apt to
show at times. Loving him as she did in spite of his faults, she
desired like a true wife to screen them from all eyes, especially from
the sensitive, high-souled, innermost circle of her home.
"All right, Hester, I'll submit the letter for your approval. You can
expunge all that you think would not go down in that quarter," said
her husband lightly.
Hester, in the fullness of her heart, thought now to enliven their talk
by giving her husband some passages from the happy hours spent
at Ennore, and began to expatiate on the delight of the girls on its
varied attractions, and how all the arrangements were carried out
without a single hitch, Waller having sent roomy carriages and good
horses, and as he promised, "done the Misses proud!"
"But, by the way, there did threaten to be a little fiasco," she said,
recalling an incident she had half forgotten. "I really must tell you
about that, Alfred. It was at the afternoon meeting the day before. I
was telling the girls the secret of the treat which I thought had been
well kept by those two I met on the road. It must have leaked out
somewhere, for just as I was unfolding it, the door was pushed open
and a striking-looking girl stepped in and sat down. Some rather
sulky glances were directed towards her, I noticed, and seemed to
me to ask, 'Is this new-comer to share the privilege of the faithful
attenders of the class?' I thought I must at once clear the
atmosphere and begin to explain that Mrs. Fellowes' invitation was
limited to a number, and so exclude any hope the interloper might
have had of being included. I made some remark, intended really to
soften the possible disappointment, but the girl answered very
Welcome to our website – the perfect destination for book lovers and
knowledge seekers. We believe that every book holds a new world,
offering opportunities for learning, discovery, and personal growth.
That’s why we are dedicated to bringing you a diverse collection of
books, ranging from classic literature and specialized publications to
self-development guides and children's books.

More than just a book-buying platform, we strive to be a bridge


connecting you with timeless cultural and intellectual values. With an
elegant, user-friendly interface and a smart search system, you can
quickly find the books that best suit your interests. Additionally,
our special promotions and home delivery services help you save time
and fully enjoy the joy of reading.

Join us on a journey of knowledge exploration, passion nurturing, and


personal growth every day!

ebookbell.com

You might also like