Hello Kim,
You bring up a very interesting theoretical point for event-based structured light systems.
Short answer:
Yes. As a high event rate causes high readout latency, it is possible to reduce the readout latency for event cameras by defining regions of interest (ROIs) for readout.
Long answer:
There are multiple reasons why you would want to do such filtered readout for a structured light system. By design, event cameras are designed for the readout of sparse asynchronous data, while structured light systems benefit from dense, synchronous projections (as using fewer denser projections means you can estimate depth for each pixel faster). Thus, combining dense projections with some form of ROI filter offers the best of both worlds, allowing for fast depth estimation only for regions of interest that require depth estimation. This is directly linked to the topic of "guided depth sensing", which is an active area of research where a secondary, "guiding" camera is used to detect regions of interest in the scene to estimate depth for while a structured light system is used to estimate depth for that region of interest (see
this paper for a brief introduction into the topic). Funnily enough, my master's thesis topic was exactly on this, where we developed with iniVation a faster-than-real-time event-guided depth sensing system capable of spatially asynchronous scanning of objects at speeds of over 1 kHz (using 2 DVXplorer cameras and a DLP 4500 projector).
From a technical point of view, my only recommendation is to define the region of interest from the projector side rather than from the camera side.
Most iniVation cameras, such as the DAVIS 346 and DVXplorer, come with a native ROI filter that allows directly cropping event data from the camera before sending out over USB. These filters, however, operate differently for different cameras. For the DVXplorer camera, the internal camera chip directly supports both an ROI filter (defined as a rectangle of the entire sensor resolution) and an area blocking filter (which blocks out event data from different 32x32 blocks of pixels). The area blocking filter directly blocks event data from blocks of pixels, resulting in a reduced event rate before timestamping, and thus a lower readout latency. This is not the case for the ROI filter, which if I am not mistaken filters event data only after timestamping, meaning that it has minimal effect on the readout latency. The DAVIS 346 camera only offers an ROI filter on the FPGA, so setting such ROI filter should not significantly reduce readout latency (despite reducing the output event rate received over USB).
On the otherhand, setting the region of interest on the DLP 4500 can be simply done through the masking of projected bit images. To allow for the fast adaptation of the projected bit images, you can operate the DLP in video pattern mode, and use masking operations on the GPU to mask the frames provided to the DLP projector over HDMI, which can then project individual bit images from the received RGB frames. Note that this is rather intensive, and I would recommend taking a look at the
DLP 4500 User Guide for an explanation of the operation of the projector in such mode.
In any case, here is an explanation for how to setup the ROI filter for the event camera. Through
dv-runtime, enabling the ROI filter is possible through the "crop" option in the input module. Through
dv-processing, enabling the ROI filter is possible through the
deviceConfigSet method of the
CameraCapture class, where the configurations for setting the ROI can be found
here. For example, using the C++ API for dv-processing, you can set the region of interest for a DAVIS 346 camera to a rectangle with x coordinates ranging from 10-20 and y coordinates ranging from 30-40 as follows:
//Initialize camera capture
dv::io::CameraCapture capture;
//Setting the x-coordinate range
const uint32_t xStart = 10, xEnd = 20;
capture.deviceConfigSet(DAVIS_CONFIG_DVS, DAVIS_CONFIG_DVS_FILTER_ROI_START_COLUMN, xStart);
capture.deviceConfigSet(DAVIS_CONFIG_DVS, DAVIS_CONFIG_DVS_FILTER_ROI_END_COLUMN, xEnd);
//Setting the y-coordinate range
const uint32_t yStart = 30, yEnd = 40;
capture.deviceConfigSet(DAVIS_CONFIG_DVS, DAVIS_CONFIG_DVS_FILTER_ROI_START_ROW, yStart);
capture.deviceConfigSet(DAVIS_CONFIG_DVS, DAVIS_CONFIG_DVS_FILTER_ROI_END_ROW, yEnd);
Hope this answers your question.
Kind regards,
Marwan