Code Generation with VideoDevice System Object
Using the codegen
Function
The VideoDevice System object™ supports code generation in MATLAB® via the codegen
function. To use the
codegen
function, you must have a MATLAB
Coder™ license. System objects also support code generation using the MATLAB
Function block in Simulink®. You can also use the System object with MATLAB
Compiler™.
Note
The MATLAB Compiler software supports System objects for use inside MATLAB functions. The MATLAB Compiler does not support System objects for use in MATLAB scripts.
Note
If you use the codegen
command to generate a MEX function
on a Windows® platform, you need to perform imaqreset
before
running the generated MEX file. However, MEX does not work correctly if the
Kinect® for Windows Sensor support package is installed.
After running the generated MEX file, if you run some MATLAB code that includes a VideoDevice System object with a camera adaptor that is also used in the generated MEX file,
you need to perform clear mex
first.
Note
The codegen
command can be used to generate executable
files on non-Windows platforms. However, generation of the MEX function is not
supported on Linux® and macOS platforms.
For more information see the documentation for the MATLAB
codegen
function.
Shared Library Dependencies
The VideoDevice System object generates code with limited portability. The System object uses precompiled shared libraries, such as DLLs, to support I/O for specific types of devices. The shared library locations that the generated executable requires are as follows:
Specific MathWorks shared libraries under [MATLABROOT]\bin\<ARCH>\
MathWorks adaptor libraries under [MATLABROOT]\SupportPackages\<RELEASE>\toolbox\imaq\supportpackages\genericvideo\adaptor\<ARCH>\ specific to the device selected.
For example, your path may look like this on a Windows system and using release R2018a:
C:\ProgramData\MATLAB\SupportPackages\R2018a\toolbox\imaq\supportpackages\genericvideo\adaptor\win64
You will need to add the above folders to your system path before running the generated executable outside of MATLAB.
Usage Rules for System Objects in Generated MATLAB Code
Assign System objects to persistent variables.
Global variables are not supported.
Initialize System objects once by embedding the object handles in an
if
statement with a call toisempty( )
.Call the constructor exactly once for each System object.
Set arguments to System object constructors as compile-time constants.
Use the object constructor to set System object properties because you cannot use dot notation for code generation. You can use the
get
function to display properties.Test your code in simulation before generating code.
The following shows an example of some of these rules.
% Note: System Objects created for Codegen have to be persistent variables. persistent vid; % Construct the IMAQ VideoDevice System Object. if isempty(vid) % Note: All required parameters must be passed to the System Object at % the point of construction. vid = imaq.VideoDevice('winvideo', 1, 'MJPG_320x240', ... 'ROI', [1 1 320 240], ... 'ReturnedColorSpace', 'rgb', ... 'DeviceProperties.Brightness', 130, ... 'DeviceProperties.Sharpness', 220); end
Limitations on Using System Objects in Generated MATLAB Code
Ensure that the value assigned to a nontunable or public property is a constant and that there is at most one assignment to that property (including the assignment in the constructor). Do not set any properties during code generation.
The only System object functions supported in code generation are:
get
getNumInputs
getNumOutputs
reset
step
Do not set System objects to become outputs from the 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 (i.e., functions called in
interpreted mode) using the coder.extrinsic
function. Do not
return System objects from any extrinsic functions.