Skip to content

Commit

Permalink
Merge pull request #1218 from luxonis/update_manip_examples
Browse files Browse the repository at this point in the history
Updated imageManip examples by adding full hd frame as well,
  • Loading branch information
moratom authored Jan 27, 2025
2 parents 19be0f8 + 5587d96 commit f2c7303
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 12 deletions.
2 changes: 1 addition & 1 deletion examples/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ dai_add_example(camera_multiple_outputs Camera/camera_multiple_outputs.cpp OFF O
dai_add_example(image_manip_host HostNodes/image_manip_host.cpp OFF OFF)
dai_add_example(image_manip_color_conversion_host HostNodes/image_manip_color_conversion.cpp OFF OFF)
dai_add_example(image_manip_v2_resize ImageManip/image_manip_v2_resize.cpp OFF OFF)
dai_add_example(image_manip_v2_mod ImageManip/image_manip_v2_mod.cpp OFF OFF)
dai_add_example(image_manip_v2_multi_ops ImageManip/image_manip_v2_multi_ops.cpp OFF OFF)
dai_add_example(image_manip_color_conversion ImageManip/image_manip_color_conversion.cpp OFF OFF)

# Record
Expand Down
4 changes: 2 additions & 2 deletions examples/python/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -158,8 +158,8 @@ add_python_example(threaded_host_nodes HostNodes/threaded_host_nodes.py)
dai_set_example_test_labels(threaded_host_nodes ondevice rvc2_all rvc4 ci)

## ImageManip
add_python_example(image_manip_mod ImageManip/image_manip_v2_mod.py)
dai_set_example_test_labels(image_manip_mod ondevice rvc2_all rvc4 ci)
add_python_example(image_manip_v2_multi_ops ImageManip/image_manip_v2_multi_ops.py)
dai_set_example_test_labels(image_manip_v2_multi_ops ondevice rvc2_all rvc4 ci)

add_python_example(image_manip_resize ImageManip/image_manip_v2_resize.py)
dai_set_example_test_labels(image_manip_resize ondevice rvc2_all rvc4 ci)
Expand Down
62 changes: 62 additions & 0 deletions examples/python/ImageManip/image_manip_v2_all_ops.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import depthai as dai
import cv2

pipeline = dai.Pipeline()

manip_input = pipeline.create(dai.node.ImageManipV2)
manip_input.initialConfig.setFrameType(dai.ImgFrame.Type.BGR888p)
inputQueue = manip_input.inputImage.createInputQueue()

manip_ops = [
# Resize operations. If aspect ratio isn't the same, the image will be stretched/cropped/letterboxed (depending on resize mode)
# Docs here: https://docs.luxonis.com/software/depthai/resolution-techniques/
('resize_stretch', lambda conf: conf.setOutputSize(256, 200, dai.ImageManipConfigV2.ResizeMode.STRETCH)),
('resize_letterbox', lambda conf: conf.setOutputSize(256, 200, dai.ImageManipConfigV2.ResizeMode.LETTERBOX)),
('resize_center_crop', lambda conf: conf.setOutputSize(256, 200, dai.ImageManipConfigV2.ResizeMode.CENTER_CROP)),
# Crop the image topLeft (10,40) to bottomRight (310,110)
('crop', lambda conf: conf.addCrop(x=50, y=50, w=150, h=200)),
# Flip the frame vertically/horizontally
('flip_vertical', lambda conf: conf.addFlipVertical()),
('flip_horizontal', lambda conf: conf.addFlipHorizontal()),
# Scale the image by 0.7x in x and 0.5x in y
('scale', lambda conf: conf.addScale(0.7, 0.5)),
# Rotate. If center isn't specified, it will rotate around center (0.5, 0.5)
('rotate_90_deg', lambda conf: conf.addRotateDeg(90)),
('rotate_90_deg_center', lambda conf: conf.addRotateDeg(90, center=dai.Point2f(0.2, 0.3)).setOutputCenter(False)),
('transform_affine', lambda conf: conf.addTransformAffine( # Shearing
[1, 0.5,
0.2, 1])),
('transform_perspective', lambda conf: conf.addTransformPerspective(
[1.0, 0.2, 0.0, # First row
0.1, 1.0, 0.0, # Second row
0.001, 0.002, 1.0])), # Third row
('frame_type', lambda conf: conf.setFrameType(dai.ImgFrame.Type.RAW8)), # to Grayscale
]

# Dynamically create ImageManipV2 nodes, apply configurations, and set up queues
queues = {}
for name, config in manip_ops:
print(name, config)
manip = pipeline.create(dai.node.ImageManipV2)
config(manip.initialConfig)
manip_input.out.link(manip.inputImage)
queues[name] = manip.out.createOutputQueue(maxSize=4, blocking=False)


imgFrame = dai.ImgFrame()

input_frame = cv2.imread('../models/lenna.png') # 512x512
# Send 256x256 image to the device
imgFrame.setCvFrame(cv2.pyrDown(input_frame), dai.ImgFrame.Type.BGR888i)
inputQueue.send(imgFrame)

cv2.imshow('input_image', input_frame)


pipeline.start()

for name, queue in queues.items():
inFrame = queue.get()
cv2.imshow(name, inFrame.getCvFrame())

key = cv2.waitKey(0)
20 changes: 11 additions & 9 deletions examples/python/ImageManip/image_manip_v2_resize.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,21 @@
camRgb = pipeline.create(dai.node.Camera).build(dai.CameraBoardSocket.CAM_A)
manip = pipeline.create(dai.node.ImageManipV2)


manip.initialConfig.setOutputSize(300, 300, dai.ImageManipConfigV2.ResizeMode.STRETCH)

camRgb.requestOutput((1920, 1080)).link(manip.inputImage)
camOut = camRgb.requestOutput((1920, 1080))
camOut.link(manip.inputImage)

out = manip.out.createOutputQueue()
manipQ = manip.out.createOutputQueue()
camQ = camOut.createOutputQueue()

pipeline.start()

while True:
inFrame = out.get()
if inFrame is not None:
cv2.imshow("Show frame", inFrame.getCvFrame())
key = cv2.waitKey(1)
if key == ord('q'):
break
if manipQ.has():
cv2.imshow("Manip frame", manipQ.get().getCvFrame())
if camQ.has():
cv2.imshow("Camera frame", camQ.get().getCvFrame())
key = cv2.waitKey(1)
if key == ord('q'):
break

0 comments on commit f2c7303

Please sign in to comment.