Add New Sensor Interface
Going to first make a new implementation of IReader to talk to new hardware. Checkout the iPhone IReader or Kinect IReader for inspiration on to get it done. You might then need to extend IFrame for possibly new frame types or data types. You can use parameters in the config.yaml to help define your IReader and make it flexible to things like fps, data types, resolution. Constructing your IReader will happen from those parameters. Make an example config.yaml to be used by ssp_server.cc. Then update ssp_server.cc to be able to read the config.yaml and create the IReader. If new data types are used and you want to use libav_encoder.cc you will need to update it to handle new data types. Finally, you will need to update image_converter.cc for any of the new data types in FrameStructToMat if you want to see it in sensor stream client. You made do some final rescaling to visualize in ssp_client_opencv.cc. If you need to add any libraries or deploy to new platforms will need to update cmake.
- Start by creating a new .yaml in /configs
- Start with null encoders for each of the types
- From the parameters the IReader will need to return at least GetTypes() and GetFps()
- You can create "parameters" under "frame_source" to define what you need to correctly grab from your new frame source
- Kinect has stream rate and what streams
- VideoReader has a path to the file
If implementing a frame type that requires local processing, like body detection, you will need to have a function that can be called that returns detected bodies. This will require opening a connection to a sensor feed that automatically detects bodies each frame, then pulling in the bodies into frame data in the FrameStruct.
- FrameStruct has fields
- Likely that the new interface will possibly have a new frame_type (color, depth, ir, confidence)
- object will be a new frame_type
- Likely that the frame_data_type might be new
- Maybe a new color space
- Or confidence level is an int
- Can create a new encoder or can update an existing encoder
- Most likely will be updating libav if it has to do with color frames
- If you create a new encoder will need to also implement decoding encoding frames
- The encoder converts the raw frame into an encoded frame (represented as a packet in the code). Multiple raw frames may be needed to produce a packet. The code accounts for that and sends frames to the encoder until the encoder returns a frame.
- For each frame type, when you first sent a frame, it sends all the information required to decode those frames (codec type and all other coded information needed, remember the data and extra data fields).
- The decoder of the client has a hashmap that keeps track of all these decoder information for all received frame streams
- The decoder transforms this frame into a raw OpenCV image, with the same number of channels, width, height, .. as the original.
- Can just use null encoder if do not want to implement a new IEncoder or update an existing IEncoder
- If necessary can also update ssp_client_opencv to normalize or change color data
- Can see example of this for confidence streamed from iPhone into black, grey, white
- Can see example of this for depth streamed from iPhone
- Current approach is pre-built binaries for each platform
- If can create dep.tar.gz for the platform moetsi will host and support the new platform dependency
- ffmpeg 4.3 as shared libraries without the GPL option. Path in the
dylibis changed to use
@rpathfor easier linking.
- OpenCV 3.4.13 as a static library, only core, imgproc, imgcodecs and highgui modules are built.
- Cereal 1.3.0, header only
- spdlog 1.8.2, header only but built as static library for faster compile
- Zdepth (commit 9b333d9aec520 which includes a patch to generate
- yaml-cpp 0.6.3 as a static library
- libzmq 4.3.4 as a static library
- cppzmq 4.7.1, header only
- Can require more libraries on the platform to interact with specific hardware possibly
- Will need to add to the conditionals when reading the config.yaml and implement for the new frame source
- Will need to feed the parameters to the IReader implementation constructor to create the correct IReader
- This can require looking for the config.yaml file as is the case for iOS
- In the case of plug-ins will also need to update to provide callable functionality as a plugin