--- name: matlab-use-cameras description: > Connect to and acquire images from cameras in MATLAB using Image Acquisition Toolbox. Use this skill when the user wants to: use a webcam, acquire images, capture video, stream from a camera, connect to a GigE Vision camera, preview live video, list available cameras, configure camera properties, use a CoaXPress frame grabber, or use a Camera Link frame grabber. Covers USB webcams, GigE Vision, USB3 Vision, CoaXPress, Camera Link, and GenICam-compliant cameras. Always prefer videoinput from Image Acquisition Toolbox over webcam support package or gigecam. license: https://www.mathworks.com/content/dam/mathworks/license/pmrl/license.md metadata: author: MathWorks version: "1.0" --- # Using Cameras in MATLAB Use Image Acquisition Toolbox's `videoinput` as the primary interface for all camera workflows. Other interfaces (`webcam`, `gigecam`) are secondary and should only be used when explicitly requested or when `videoinput` is unavailable. ## When to Use - User wants to connect to a camera (webcam, USB, GigE, USB3 Vision, CoaXPress, Camera Link) - User wants to acquire images or video frames - User wants to preview live camera feed - User wants to list or enumerate available cameras - User wants to acquire images from a CoaXPress frame grabber - User wants to acquire images via a Camera Link frame grabber - User asks "how do I use my webcam/camera in MATLAB?" - User mentions Image Acquisition Toolbox ## When NOT to Use - User explicitly requests `webcam()` from the webcam support package - User is on MATLAB Online (where `videoinput` is not available — use `webcam()`) - User is doing image processing on existing files (no camera involved) - User is working with non-imaging hardware (oscilloscopes, data acquisition boards) ## Conventions ### API Priority Rules These rules are critical. Follow them unless the user explicitly requests otherwise. 1. **Always use `videoinput()` from Image Acquisition Toolbox** as the primary camera interface 2. **Always use `imaqhwinfo`** for device enumeration — not `webcamlist` or `gigecamlist` 3. **For GigE Vision cameras:** use `videoinput("gentl", ...)` — not `gigecam` or `videoinput("gige")` 4. **For USB/built-in webcams on Windows:** use `videoinput("winvideo", ...)` 5. **For USB/built-in webcams on macOS:** use `videoinput("macvideo", ...)` 6. **For USB/built-in webcams on Linux:** use `videoinput("linuxvideo", ...)` 7. **For CoaXPress cameras:** use `videoinput("gentl", ...)` — CoaXPress frame grabbers always provide GenTL producers 8. **For Camera Link cameras:** prefer `videoinput("gentl", ...)` if the frame grabber provides a GenTL producer; otherwise use the vendor-specific adaptor (e.g., `videoinput("ni", ...)`, `videoinput("dalsa", ...)`) 9. **If user specifies a CoaXPress or Camera Link camera without naming the frame grabber:** ask the user which frame grabber they are using before writing code — the adaptor choice depends on the frame grabber 10. **Never describe `videoinput` as "legacy" or "advanced"** — it is the primary, full-featured interface ### When to use `webcam()` instead Only in these cases: - User explicitly asks for it - User is on MATLAB Online - Image Acquisition Toolbox is not installed (confirm with `imaqhwinfo`) ### Required support packages | Camera type | Adaptor | Support Package | Vendor GenTL Producer (.cti) | |-------------|---------|-----------------|------------------------------| | USB/built-in webcam (Windows) | `"winvideo"` | OS Generic Video Interface | Not required | | USB/built-in webcam (macOS) | `"macvideo"` | OS Generic Video Interface | Not required | | USB/built-in webcam (Linux) | `"linuxvideo"` | OS Generic Video Interface | Not required | | GigE Vision camera | `"gentl"` | GenICam Interface | **Required** — from camera vendor | | USB3 Vision camera | `"gentl"` | GenICam Interface | **Required** — from camera vendor | | CoaXPress camera (via frame grabber) | `"gentl"` | GenICam Interface | **Required** — from frame grabber vendor | | Camera Link camera (GenTL producer) | `"gentl"` | GenICam Interface | **Required** — from frame grabber vendor | | Camera Link camera (vendor adaptor) | vendor-specific (e.g., `"ni"`, `"dalsa"`) | Vendor-provided hardware adaptor | Not applicable | **Important:** The GenICam Interface support package provides only the MATLAB-side consumer. For `gentl` cameras, you must **also** install the vendor's GenTL producer (a `.cti` file). Examples: Spinnaker SDK for FLIR, Vimba X for Allied Vision, ImpactAcquire for Balluff, Euresys eGrabber for Euresys frame grabbers. The producer is NOT bundled with the MATLAB support package. ## Workflow ### 1. Enumerate devices ```matlab % List all available adaptors and devices info = imaqhwinfo; disp(info.InstalledAdaptors) % Get details for a specific adaptor adaptorInfo = imaqhwinfo("winvideo"); disp(adaptorInfo.DeviceInfo) ``` ### 2. Connect to camera ```matlab % USB/built-in webcam on Windows vid = videoinput("winvideo", 1); % GigE Vision camera via GenTL vid = videoinput("gentl", 1); % Specify a format vid = videoinput("winvideo", 1, "YUY2_1280x720"); ``` ### 3. Configure properties ```matlab % Set color space vid.ReturnedColorSpace = "rgb"; % Set region of interest [x_offset y_offset width height] vid.ROIPosition = [0 0 640 480]; % Access device-specific properties via the source object src = getselectedsource(vid); ``` ### 4. Preview live video ```matlab preview(vid); pause(3); ``` ### 5. Acquire frames Single snapshot: ```matlab img = getsnapshot(vid); imshow(img); ``` Multiple frames (immediate trigger): ```matlab vid.FramesPerTrigger = 10; start(vid); wait(vid); [frames, timestamps] = getdata(vid); ``` Manual trigger (acquire on demand): ```matlab triggerconfig(vid, "manual"); vid.FramesPerTrigger = 1; start(vid); trigger(vid); img = getdata(vid); ``` ### 6. Clean up ```matlab stoppreview(vid); stop(vid); delete(vid); clear vid; ``` ## Key Functions | Function | Purpose | Source | |----------|---------|--------| | `imaqhwinfo` | List adaptors and devices | Image Acquisition Toolbox | | `videoinput` | Create video input object (primary interface) | Image Acquisition Toolbox | | `preview` | Show live video feed | Image Acquisition Toolbox | | `getsnapshot` | Capture single frame immediately | Image Acquisition Toolbox | | `start` | Begin acquisition | Image Acquisition Toolbox | | `getdata` | Retrieve acquired frames from buffer | Image Acquisition Toolbox | | `stop` | Stop acquisition | Image Acquisition Toolbox | | `getselectedsource` | Access device-specific properties | Image Acquisition Toolbox | | `triggerconfig` | Configure trigger type (immediate, manual, hardware) | Image Acquisition Toolbox | | `trigger` | Execute manual trigger after `start` | Image Acquisition Toolbox | | `imageAcquisitionExplorer` | Launch interactive acquisition app | Image Acquisition Toolbox | ## Patterns ### USB/Built-in Webcam (Windows) ```matlab % Enumerate info = imaqhwinfo("winvideo"); disp(info.DeviceInfo.DeviceName) % Connect and configure vid = videoinput("winvideo", 1, "YUY2_1280x720"); vid.ReturnedColorSpace = "rgb"; vid.FramesPerTrigger = 1; % Preview and capture preview(vid); pause(2); img = getsnapshot(vid); imshow(img); % Clean up stoppreview(vid); delete(vid); clear vid; ``` ### GigE Vision Camera (GenTL) The GenTL adaptor is the preferred interface for GigE Vision and USB3 Vision cameras. It supports the full GenICam standard and works across camera vendors. ```matlab % Enumerate info = imaqhwinfo("gentl"); disp(info.DeviceInfo.DeviceName) % Connect vid = videoinput("gentl", 1); vid.ReturnedColorSpace = "rgb"; % Configure acquisition vid.FramesPerTrigger = 10; % Access GenICam properties via source object src = getselectedsource(vid); % Acquire start(vid); wait(vid); [frames, timestamps] = getdata(vid); % Clean up stop(vid); delete(vid); clear vid; ``` If the GenTL adaptor is not installed, guide the user through setup: 1. Install "Image Acquisition Toolbox Support Package for GenICam Interface" via Add-On Explorer 2. Install the vendor's GenTL producer (a `.cti` file) — e.g., Spinnaker SDK for FLIR cameras, Vimba X for Allied Vision, or the vendor's GigE Vision SDK 3. Verify with `imaqhwinfo("gentl")` — the camera should appear in `DeviceInfo` See `references/gentl-setup.md` for detailed GenTL producer configuration and troubleshooting. ### CoaXPress Camera (via Frame Grabber) CoaXPress frame grabbers always provide a GenTL producer, so the workflow is identical to GigE Vision via the `gentl` adaptor. ```matlab % Enumerate — CoaXPress cameras appear under the gentl adaptor info = imaqhwinfo("gentl"); disp(info.DeviceInfo.DeviceName) % Connect and acquire vid = videoinput("gentl", 1); vid.ReturnedColorSpace = "rgb"; vid.FramesPerTrigger = 10; src = getselectedsource(vid); start(vid); wait(vid); [frames, timestamps] = getdata(vid); % Clean up stop(vid); delete(vid); clear vid; ``` ### Camera Link Camera (via Frame Grabber) Camera Link has two paths depending on whether the frame grabber vendor provides a GenTL producer: **With GenTL producer (preferred):** Use `videoinput("gentl", ...)` — same as GigE/CoaXPress above. **Without GenTL producer (vendor adaptor):** Use the vendor-specific adaptor registered with `imaqhwinfo`: ```matlab % Check which adaptors are available info = imaqhwinfo; disp(info.InstalledAdaptors) % Connect via vendor adaptor (e.g., "ni" for National Instruments) vid = videoinput("ni", 1); vid.ReturnedColorSpace = "rgb"; src = getselectedsource(vid); ``` **Important:** If the user mentions a Camera Link or CoaXPress camera without specifying the frame grabber, ask which frame grabber they are using. The correct adaptor depends on the frame grabber, not the camera. ## Common Mistakes | Mistake | Why it's wrong | Correct approach | |---------|---------------|-----------------| | Using `webcam()` for USB cameras | Bypasses IMAQ's full feature set (triggering, ROI, logging, callbacks) | Use `videoinput("winvideo", ...)` | | Using `webcamlist` to find cameras | Only finds webcam-support-package devices, misses industrial cameras | Use `imaqhwinfo` | | Using `gigecam` for GigE cameras | Limited interface, doesn't support full GenICam feature set | Use `videoinput("gentl", ...)` | | Using `videoinput("gige", ...)` | Legacy adaptor, not actively maintained | Use `videoinput("gentl", ...)` | | Using `gigecamlist` for GigE enumeration | Limited to GigE Vision Hardware Support Package | Use `imaqhwinfo("gentl")` | | Calling `videoinput` "legacy" | It is the primary, actively maintained interface | Present `videoinput` as the recommended approach | | Using `snapshot(cam)` for capture | That's the webcam support package function | Use `getsnapshot(vid)` with videoinput | | Using `now`/`datenum` for timestamps | Deprecated serial date numbers | Use `datetime("now")` for timing metadata | | Assuming Camera Link needs a special interface | GenTL works for Camera Link if the frame grabber vendor provides a producer | Try `videoinput("gentl", ...)` first, fall back to vendor adaptor | ---- Copyright 2026 The MathWorks, Inc. ----