MATLAB: Webcams won’t work with Image Acquisition tool when connected via USB hub

usb hubwebcam

Hi,
I am currently doing a project that involves 3D reconstruction using a camera array.
I have 16 Microsoft HD-3000 webcams, Matlab R2017a on Windows 7 (64bit) OS.
I need the pictures to be taken simultaneously, which I found out is impossible with those webcams. Therefore I am recording short 'overlapping videos', measuring time difference between individual cameras triggering and ultimately extracting specific frames from the videos.
So far I have wrote a matlab code which detects how many cameras are plugged to the computer, then set camera parameters, records videos, saves them into the folder and measures time differences.
The code works fine when the cameras are plugged directly via computer's USB ports (tested on max. 8 cameras at a time since that is how many USB ports my computer has). However when I try plugging in the cameras via USB hub (StarTech), it won't work. It detects the cameras, sets parameters for each of them and 'tries' to take a video (it even gives me time difference), but the videos never appear on the drive. I am also getting following warning at the very beginning of running the code:
"Warning: An object in OBJ could not be started, was already started, or is invalid. "
All cameras are accessible and available for the preview in Image Acquisition Toolbox.
FYI, the USB Hub was supposed to be socket-powered, however it doesn't seem to work and I was testing it while powered from the computer.
Do you have any idea how to make it work? I have been struggling with this for the last couple of days.
Thanks in advance for your reply. Wojciech

Best Answer

In my experience, it would not be uncommon for a computer with 8 USB ports to internally have 3 USB busses split over 2 USB controllers, with the second controller also handling the keyboard and mouse and Bluetooth.
For frame-level synchronization, ideally each camera should be on its own USB 3.0 bus. I would not consider putting more than 2 cameras on the same USB 2.0 bus (and would expect occasional glitches); I might generally be willing to test with 3 cameras on the same USB 3.0 bus but certainly not for real-time work -- and since those particular webcams only have USB 2.0 capacity, USB 3.0 ports would have to hold their speed down to USB 2.0 so with a USB 3.0 bus you would, in such a case, only get the benefit of a faster controller that might have more memory.
USB hubs are not really transparent to the USB process. You can examine your USB configuration and you will see each hub and you will see the ports attached to each of its ports.
Anyhow, for purposes like yours, it would be better to be using a data acquisition system that had one bus per slot and time-stamped the data and bundled it for transfer... especially if you can do that through a real external bus like PCIe instead of through a USB connection.
As best I recall at the moment, no-one has posted reporting being able to handle more than 7 USB cameras simultaneously, with the 8th camera leading to USB problems.
USB is a serial protocol with a master/slave relationship in which only one device per bus can be communicating, with the master polling each device to find out which one has data to transfer and then going around and telling each one in sequence "Okay, you can send this much of your data". It does not in itself support triggers -- there is no way to tell all the cameras on a single bus to take a frame at the same time. There is certainly no way to have multiple cameras on the same bus transfer frames at the same time.
For frame synchronization work, you would prefer to have GENLOCK or equivalent. Some of the National Instruments data acquisition boxes support GENLOCK of multiple channels, for the cases where the important factor is not that the devices be triggered at a particular absolute time controlled by the host computer but rather that the devices all be triggered at the same time relative to each other.