ImageManip¶
ImageManip node can be used to crop, rotate rectangle area or perform various image transforms: rotate, mirror, flip, perspective transform.
For downscaling, ImageManip uses the bilinear/bicubic interpolation.
How to place it¶
pipeline = dai.Pipeline()
manip = pipeline.create(dai.node.ImageManip)
dai::Pipeline pipeline;
auto manip = pipeline.create<dai::node::ImageManip>();
Inputs and Outputs¶
┌───────────────────┐
inputImage │ │
──────────────►│ │
│ │ out
│ ImageManip ├───────────►
inputConfig │ │
──────────────►│ │
│ │
└───────────────────┘
Message types
inputImage
- ImgFrameinputConfig
- ImageManipConfigout
- ImgFrame
Usage¶
pipeline = dai.Pipeline()
manip = pipeline.create(dai.node.ImageManip)
manip.initialConfig.setResize(300, 300)
manip.initialConfig.setFrameType(dai.ImgFrame.Type.BGR888p)
dai::Pipeline pipeline;
auto manip = pipeline.create<dai::node::ImageManip>();
manip->initialConfig.setResize(300, 300);
manip->initialConfig.setFrameType(dai::ImgFrame::Type::BGR888p);
Image formats supported¶
ImageManip node supports the following image formats (more info in PR here):
Input formats supported: RGB/BGR, planar/interleaved, YUV/NV12, RAW8 and GRAY8
Convert format to any other format mentioned above
RAW16 (uint16,
depth
output) supported, but without color conversion capability
Note that planar formats are faster to process, so interleaved images should be avoided (eg. NV12 input).
Limitations¶
Besides limitations mentioned above (unsupported frame formats), there are other limitations:
Due to HW warp constraint, rotating/warping can be done only on frames whose width values are multiples of 16
Maximum output width of a frame is 4056 pixels
Examples of functionality¶
ImageManip Tiling - Using ImageManip for frame tiling
ImageManip Rotate - Using ImageManip to rotate color/mono frames
Reference¶
-
class
depthai.node.
ImageManip
-
class
Id
Node identificator. Unique for every node on a single Pipeline
-
getAssetManager
(*args, **kwargs) Overloaded function.
getAssetManager(self: depthai.Node) -> depthai.AssetManager
getAssetManager(self: depthai.Node) -> depthai.AssetManager
-
getInputRefs
(*args, **kwargs) Overloaded function.
getInputRefs(self: depthai.Node) -> list[depthai.Node.Input]
getInputRefs(self: depthai.Node) -> list[depthai.Node.Input]
-
getInputs
(self: depthai.Node) → list[depthai.Node.Input]
-
getName
(self: depthai.Node) → str
-
getOutputRefs
(*args, **kwargs) Overloaded function.
getOutputRefs(self: depthai.Node) -> list[depthai.Node.Output]
getOutputRefs(self: depthai.Node) -> list[depthai.Node.Output]
-
getOutputs
(self: depthai.Node) → list[depthai.Node.Output]
-
getParentPipeline
(*args, **kwargs) Overloaded function.
getParentPipeline(self: depthai.Node) -> depthai.Pipeline
getParentPipeline(self: depthai.Node) -> depthai.Pipeline
-
getWaitForConfigInput
(self: depthai.node.ImageManip) → bool
-
setCenterCrop
(self: depthai.node.ImageManip, arg0: float, arg1: float) → None
-
setCropRect
(self: depthai.node.ImageManip, arg0: float, arg1: float, arg2: float, arg3: float) → None
-
setFrameType
(self: depthai.node.ImageManip, arg0: depthai.RawImgFrame.Type) → None
-
setHorizontalFlip
(self: depthai.node.ImageManip, arg0: bool) → None
-
setKeepAspectRatio
(self: depthai.node.ImageManip, arg0: bool) → None
-
setMaxOutputFrameSize
(self: depthai.node.ImageManip, arg0: int) → None
-
setNumFramesPool
(self: depthai.node.ImageManip, arg0: int) → None
-
setResize
(self: depthai.node.ImageManip, arg0: int, arg1: int) → None
-
setResizeThumbnail
(self: depthai.node.ImageManip, arg0: int, arg1: int, arg2: int, arg3: int, arg4: int) → None
-
setWaitForConfigInput
(self: depthai.node.ImageManip, wait: bool) → None
-
setWarpMesh
(*args, **kwargs) Overloaded function.
setWarpMesh(self: depthai.node.ImageManip, arg0: list[depthai.Point2f], arg1: int, arg2: int) -> None
setWarpMesh(self: depthai.node.ImageManip, arg0: list[tuple[float, float]], arg1: int, arg2: int) -> None
-
class
-
class
dai::node
::
ImageManip
: public dai::NodeCRTP<Node, ImageManip, ImageManipProperties>¶ ImageManip node. Capability to crop, resize, warp, … incoming image frames.
Public Functions
-
void
setCropRect
(float xmin, float ymin, float xmax, float ymax)¶
-
void
setCenterCrop
(float ratio, float whRatio = 1.0f)¶
-
void
setResize
(int w, int h)¶
-
void
setResizeThumbnail
(int w, int h, int bgRed = 0, int bgGreen = 0, int bgBlue = 0)¶
-
void
setHorizontalFlip
(bool flip)¶
-
void
setKeepAspectRatio
(bool keep)¶
-
void
setWaitForConfigInput
(bool wait)¶ Specify whether or not wait until configuration message arrives to inputConfig Input.
- Parameters
wait
: True to wait for configuration message, false otherwise.
-
bool
getWaitForConfigInput
() const¶ - See
- Return
True if wait for inputConfig message, false otherwise
-
void
setNumFramesPool
(int numFramesPool)¶ Specify number of frames in pool.
- Parameters
numFramesPool
: How many frames should the pool have
-
void
setMaxOutputFrameSize
(int maxFrameSize)¶ Specify maximum size of output image.
- Parameters
maxFrameSize
: Maximum frame size in bytes
-
void
setWarpMesh
(const std::vector<Point2f> &meshData, int width, int height)¶ Set a custom warp mesh
- Parameters
meshData
: 2D plane of mesh points, starting from top left to bottom rightwidth
: Width of meshheight
: Height of mesh
-
void
setWarpMesh
(const std::vector<std::pair<float, float>> &meshData, int width, int height)¶
Public Members
-
ImageManipConfig
initialConfig
¶ Initial config to use when manipulating frames
-
Input
inputConfig
= {*this, "inputConfig", Input::Type::SReceiver, true, 8, {{DatatypeEnum::ImageManipConfig, true}}}¶ Input ImageManipConfig message with ability to modify parameters in runtime Default queue is blocking with size 8
-
Input
inputImage
= {*this, "inputImage", Input::Type::SReceiver, true, 8, true, {{DatatypeEnum::ImgFrame, true}}}¶ Input image to be modified Default queue is blocking with size 8
-
Output
out
= {*this, "out", Output::Type::MSender, {{DatatypeEnum::ImgFrame, true}}}¶ Outputs ImgFrame message that carries modified image.
Public Static Attributes
-
static constexpr const char *
NAME
= "ImageManip"¶
Private Functions
-
void
setWarpMesh
(const float *meshData, int numMeshPoints, int width, int height)¶
Private Members
-
std::shared_ptr<RawImageManipConfig>
rawConfig
¶
-
void