Skip to content

Commit d5b09fa

Browse files
committed
WIP: Camera node
1 parent ba9bdfb commit d5b09fa

8 files changed

Lines changed: 242 additions & 2 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ wheelhouse/
3838
.venv
3939
env/
4040
venv/
41+
venv_*/
4142
ENV/
4243
env.bak/
4344
venv.bak/

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ pybind11_add_module(${TARGET_NAME}
107107
src/pipeline/node/XLinkInBindings.cpp
108108
src/pipeline/node/XLinkOutBindings.cpp
109109
src/pipeline/node/ColorCameraBindings.cpp
110+
src/pipeline/node/CameraBindings.cpp
110111
src/pipeline/node/MonoCameraBindings.cpp
111112
src/pipeline/node/StereoDepthBindings.cpp
112113
src/pipeline/node/NeuralNetworkBindings.cpp
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#!/usr/bin/env python3
2+
3+
import cv2
4+
import depthai as dai
5+
6+
# Create pipeline
7+
pipeline = dai.Pipeline()
8+
9+
# Define source and output
10+
cam = pipeline.create(dai.node.Camera)
11+
xoutRgb = pipeline.create(dai.node.XLinkOut)
12+
13+
xoutRgb.setStreamName("camera")
14+
15+
# Properties
16+
cam.setPreviewSize(300, 300)
17+
cam.setInterleaved(False)
18+
cam.setColorOrder(dai.CameraProperties.ColorOrder.RGB)
19+
cam.setBoardSocket(dai.CameraBoardSocket.LEFT)
20+
21+
# Linking
22+
cam.isp.link(xoutRgb.input)
23+
24+
# Connect to device and start pipeline
25+
with dai.Device(pipeline) as device:
26+
27+
print('Connected cameras:', device.getConnectedCameraFeatures())
28+
# Print out usb speed
29+
print('Usb speed:', device.getUsbSpeed().name)
30+
# Bootloader version
31+
if device.getBootloaderVersion() is not None:
32+
print('Bootloader version:', device.getBootloaderVersion())
33+
# Device name
34+
print('Device name:', device.getDeviceName())
35+
36+
# Output queue will be used to get the rgb frames from the output defined above
37+
qRgb = device.getOutputQueue(name="camera", maxSize=4, blocking=False)
38+
39+
while True:
40+
inRgb = qRgb.get() # blocking call, will wait until a new data has arrived
41+
42+
# Retrieve 'bgr' (opencv format) frame
43+
cv2.imshow("camera", inRgb.getCvFrame())
44+
45+
if cv2.waitKey(1) == ord('q'):
46+
break

src/DeviceBindings.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ void DeviceBindings::bind(pybind11::module& m, void* pCallstack){
544544
.def("flashFactoryEepromClear", [](DeviceBase& d) { py::gil_scoped_release release; d.flashFactoryEepromClear(); }, DOC(dai, DeviceBase, flashFactoryEepromClear))
545545
.def("setTimesync", [](DeviceBase& d, std::chrono::milliseconds p, int s, bool r) { py::gil_scoped_release release; return d.setTimesync(p,s,r); }, DOC(dai, DeviceBase, setTimesync))
546546
.def("setTimesync", [](DeviceBase& d, bool e) { py::gil_scoped_release release; return d.setTimesync(e); }, py::arg("enable"), DOC(dai, DeviceBase, setTimesync, 2))
547-
.def("getDeviceName", [](DeviceBase& d) { py::gil_scoped_release release; return d.getDeviceName(); }, DOC(dai, DeviceBase, getDeviceName))
547+
.def("getDeviceName", [](DeviceBase& d) { std::string name; { py::gil_scoped_release release; name = d.getDeviceName(); } return py::bytes(name).attr("decode")("utf-8", "replace"); }, DOC(dai, DeviceBase, getDeviceName))
548548
;
549549

550550

src/pipeline/PipelineBindings.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "depthai/pipeline/node/XLinkOut.hpp"
1111
#include "depthai/pipeline/node/NeuralNetwork.hpp"
1212
#include "depthai/pipeline/node/ColorCamera.hpp"
13+
#include "depthai/pipeline/node/Camera.hpp"
1314
#include "depthai/pipeline/node/VideoEncoder.hpp"
1415
#include "depthai/pipeline/node/SPIOut.hpp"
1516
#include "depthai/pipeline/node/SPIIn.hpp"
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
#include "NodeBindings.hpp"
2+
#include "Common.hpp"
3+
4+
#include "depthai/pipeline/Pipeline.hpp"
5+
#include "depthai/pipeline/Node.hpp"
6+
#include "depthai/pipeline/node/Camera.hpp"
7+
8+
void bind_camera(pybind11::module& m, void* pCallstack){
9+
10+
using namespace dai;
11+
using namespace dai::node;
12+
13+
// Node and Properties declare upfront
14+
py::class_<CameraProperties> cameraProperties(m, "CameraProperties", DOC(dai, CameraProperties));
15+
// py::enum_<CameraProperties::SensorResolution> cameraPropertiesSensorResolution(cameraProperties, "SensorResolution", DOC(dai, CameraProperties, SensorResolution));
16+
py::enum_<CameraProperties::ColorOrder> cameraPropertiesColorOrder(cameraProperties, "ColorOrder", DOC(dai, CameraProperties, ColorOrder));
17+
auto camera = ADD_NODE(Camera);
18+
19+
///////////////////////////////////////////////////////////////////////
20+
///////////////////////////////////////////////////////////////////////
21+
///////////////////////////////////////////////////////////////////////
22+
// Call the rest of the type defines, then perform the actual bindings
23+
Callstack* callstack = (Callstack*) pCallstack;
24+
auto cb = callstack->top();
25+
callstack->pop();
26+
cb(m, pCallstack);
27+
// Actual bindings
28+
///////////////////////////////////////////////////////////////////////
29+
///////////////////////////////////////////////////////////////////////
30+
///////////////////////////////////////////////////////////////////////
31+
32+
// // Camera Properties
33+
// cameraPropertiesSensorResolution
34+
// .value("THE_1080_P", CameraProperties::SensorResolution::THE_1080_P)
35+
// .value("THE_1200_P", CameraProperties::SensorResolution::THE_1200_P)
36+
// .value("THE_4_K", CameraProperties::SensorResolution::THE_4_K)
37+
// .value("THE_5_MP", CameraProperties::SensorResolution::THE_5_MP)
38+
// .value("THE_12_MP", CameraProperties::SensorResolution::THE_12_MP)
39+
// .value("THE_4000X3000", CameraProperties::SensorResolution::THE_4000X3000)
40+
// .value("THE_13_MP", CameraProperties::SensorResolution::THE_13_MP)
41+
// .value("THE_5312X6000", CameraProperties::SensorResolution::THE_5312X6000)
42+
// .value("THE_48_MP", CameraProperties::SensorResolution::THE_48_MP)
43+
// .value("THE_720_P", CameraProperties::SensorResolution::THE_720_P)
44+
// .value("THE_800_P", CameraProperties::SensorResolution::THE_800_P)
45+
// ;
46+
47+
cameraPropertiesColorOrder
48+
.value("BGR", CameraProperties::ColorOrder::BGR)
49+
.value("RGB", CameraProperties::ColorOrder::RGB)
50+
;
51+
52+
cameraProperties
53+
.def_readwrite("initialControl", &CameraProperties::initialControl)
54+
.def_readwrite("boardSocket", &CameraProperties::boardSocket)
55+
.def_readwrite("imageOrientation", &CameraProperties::imageOrientation)
56+
.def_readwrite("colorOrder", &CameraProperties::colorOrder)
57+
.def_readwrite("interleaved", &CameraProperties::interleaved)
58+
.def_readwrite("fp16", &CameraProperties::fp16)
59+
.def_readwrite("previewHeight", &CameraProperties::previewHeight)
60+
.def_readwrite("previewWidth", &CameraProperties::previewWidth)
61+
.def_readwrite("videoHeight", &CameraProperties::videoHeight)
62+
.def_readwrite("videoWidth", &CameraProperties::videoWidth)
63+
.def_readwrite("stillHeight", &CameraProperties::stillHeight)
64+
.def_readwrite("stillWidth", &CameraProperties::stillWidth)
65+
// .def_readwrite("resolution", &CameraProperties::resolution)
66+
.def_readwrite("fps", &CameraProperties::fps)
67+
.def_readwrite("sensorCropX", &CameraProperties::sensorCropX)
68+
.def_readwrite("sensorCropY", &CameraProperties::sensorCropY)
69+
.def_readwrite("previewKeepAspectRatio", &CameraProperties::previewKeepAspectRatio)
70+
.def_readwrite("ispScale", &CameraProperties::ispScale)
71+
.def_readwrite("numFramesPoolRaw", &CameraProperties::numFramesPoolRaw)
72+
.def_readwrite("numFramesPoolIsp", &CameraProperties::numFramesPoolIsp)
73+
.def_readwrite("numFramesPoolVideo", &CameraProperties::numFramesPoolVideo)
74+
.def_readwrite("numFramesPoolPreview", &CameraProperties::numFramesPoolPreview)
75+
.def_readwrite("numFramesPoolStill", &CameraProperties::numFramesPoolStill)
76+
;
77+
78+
// Camera node
79+
camera
80+
.def_readonly("inputConfig", &Camera::inputConfig, DOC(dai, node, Camera, inputConfig))
81+
.def_readonly("inputControl", &Camera::inputControl, DOC(dai, node, Camera, inputControl))
82+
.def_readonly("initialControl", &Camera::initialControl, DOC(dai, node, Camera, initialControl))
83+
.def_readonly("video", &Camera::video, DOC(dai, node, Camera, video))
84+
.def_readonly("preview", &Camera::preview, DOC(dai, node, Camera, preview))
85+
.def_readonly("still", &Camera::still, DOC(dai, node, Camera, still))
86+
.def_readonly("isp", &Camera::isp, DOC(dai, node, Camera, isp))
87+
.def_readonly("raw", &Camera::raw, DOC(dai, node, Camera, raw))
88+
.def_readonly("frameEvent", &Camera::frameEvent, DOC(dai, node, Camera, frameEvent))
89+
.def("setCamId", [](Camera& c, int64_t id) {
90+
// Issue an deprecation warning
91+
PyErr_WarnEx(PyExc_DeprecationWarning, "setCamId() is deprecated, use setBoardSocket() instead.", 1);
92+
HEDLEY_DIAGNOSTIC_PUSH
93+
HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
94+
c.setCamId(id);
95+
HEDLEY_DIAGNOSTIC_POP
96+
})
97+
.def("getCamId", [](Camera& c) {
98+
// Issue an deprecation warning
99+
PyErr_WarnEx(PyExc_DeprecationWarning, "getCamId() is deprecated, use getBoardSocket() instead.", 1);
100+
HEDLEY_DIAGNOSTIC_PUSH
101+
HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
102+
return c.getCamId();
103+
HEDLEY_DIAGNOSTIC_POP
104+
})
105+
.def("setBoardSocket", &Camera::setBoardSocket, py::arg("boardSocket"), DOC(dai, node, Camera, setBoardSocket))
106+
.def("getBoardSocket", &Camera::getBoardSocket, DOC(dai, node, Camera, getBoardSocket))
107+
.def("setImageOrientation", &Camera::setImageOrientation, py::arg("imageOrientation"), DOC(dai, node, Camera, setImageOrientation))
108+
.def("getImageOrientation", &Camera::getImageOrientation, DOC(dai, node, Camera, getImageOrientation))
109+
.def("setColorOrder", &Camera::setColorOrder, py::arg("colorOrder"), DOC(dai, node, Camera, setColorOrder))
110+
.def("getColorOrder", &Camera::getColorOrder, DOC(dai, node, Camera, getColorOrder))
111+
.def("setInterleaved", &Camera::setInterleaved, py::arg("interleaved"), DOC(dai, node, Camera, setInterleaved))
112+
.def("getInterleaved", &Camera::getInterleaved, DOC(dai, node, Camera, getInterleaved))
113+
.def("setFp16", &Camera::setFp16, py::arg("fp16"), DOC(dai, node, Camera, setFp16))
114+
.def("getFp16", &Camera::getFp16, DOC(dai, node, Camera, getFp16))
115+
.def("setPreviewSize", static_cast<void(Camera::*)(int,int)>(&Camera::setPreviewSize), py::arg("width"), py::arg("height"), DOC(dai, node, Camera, setPreviewSize))
116+
.def("setPreviewSize", static_cast<void(Camera::*)(std::tuple<int,int>)>(&Camera::setPreviewSize), py::arg("size"), DOC(dai, node, Camera, setPreviewSize, 2))
117+
.def("setVideoSize", static_cast<void(Camera::*)(int,int)>(&Camera::setVideoSize), py::arg("width"), py::arg("height"), DOC(dai, node, Camera, setVideoSize))
118+
.def("setVideoSize", static_cast<void(Camera::*)(std::tuple<int,int>)>(&Camera::setVideoSize), py::arg("size"), DOC(dai, node, Camera, setVideoSize, 2))
119+
.def("setStillSize", static_cast<void(Camera::*)(int,int)>(&Camera::setStillSize), py::arg("width"), py::arg("height"), DOC(dai, node, Camera, setStillSize))
120+
.def("setStillSize", static_cast<void(Camera::*)(std::tuple<int,int>)>(&Camera::setStillSize), py::arg("size"), DOC(dai, node, Camera, setStillSize, 2))
121+
// .def("setResolution", &Camera::setResolution, py::arg("resolution"), DOC(dai, node, Camera, setResolution))
122+
// .def("getResolution", &Camera::getResolution, DOC(dai, node, Camera, getResolution))
123+
.def("setFps", &Camera::setFps, py::arg("fps"), DOC(dai, node, Camera, setFps))
124+
.def("getFps", &Camera::getFps, DOC(dai, node, Camera, getFps))
125+
.def("getPreviewSize", &Camera::getPreviewSize, DOC(dai, node, Camera, getPreviewSize))
126+
.def("getPreviewWidth", &Camera::getPreviewWidth, DOC(dai, node, Camera, getPreviewWidth))
127+
.def("getPreviewHeight", &Camera::getPreviewHeight, DOC(dai, node, Camera, getPreviewHeight))
128+
.def("getVideoSize", &Camera::getVideoSize, DOC(dai, node, Camera, getVideoSize))
129+
.def("getVideoWidth", &Camera::getVideoWidth, DOC(dai, node, Camera, getVideoWidth))
130+
.def("getVideoHeight", &Camera::getVideoHeight, DOC(dai, node, Camera, getVideoHeight))
131+
.def("getStillSize", &Camera::getStillSize, DOC(dai, node, Camera, getStillSize))
132+
.def("getStillWidth", &Camera::getStillWidth, DOC(dai, node, Camera, getStillWidth))
133+
.def("getStillHeight", &Camera::getStillHeight, DOC(dai, node, Camera, getStillHeight))
134+
.def("getResolutionSize", &Camera::getResolutionSize, DOC(dai, node, Camera, getResolutionSize))
135+
.def("getResolutionWidth", &Camera::getResolutionWidth, DOC(dai, node, Camera, getResolutionWidth))
136+
.def("getResolutionHeight", &Camera::getResolutionHeight, DOC(dai, node, Camera, getResolutionHeight))
137+
.def("sensorCenterCrop", &Camera::sensorCenterCrop, DOC(dai, node, Camera, sensorCenterCrop))
138+
.def("setSensorCrop", &Camera::setSensorCrop, py::arg("x"), py::arg("y"), DOC(dai, node, Camera, setSensorCrop))
139+
.def("getSensorCrop", &Camera::getSensorCrop, DOC(dai, node, Camera, getSensorCrop))
140+
.def("getSensorCropX", &Camera::getSensorCropX, DOC(dai, node, Camera, getSensorCropX))
141+
.def("getSensorCropY", &Camera::getSensorCropY, DOC(dai, node, Camera, getSensorCropY))
142+
143+
.def("setWaitForConfigInput", [](Camera& cam, bool wait){
144+
// Issue a deprecation warning
145+
PyErr_WarnEx(PyExc_DeprecationWarning, "Use 'inputConfig.setWaitForMessage()' instead", 1);
146+
HEDLEY_DIAGNOSTIC_PUSH
147+
HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
148+
cam.setWaitForConfigInput(wait);
149+
HEDLEY_DIAGNOSTIC_POP
150+
}, py::arg("wait"), DOC(dai, node, Camera, setWaitForConfigInput))
151+
152+
.def("getWaitForConfigInput", [](Camera& cam){
153+
// Issue a deprecation warning
154+
PyErr_WarnEx(PyExc_DeprecationWarning, "Use 'inputConfig.setWaitForMessage()' instead", 1);
155+
HEDLEY_DIAGNOSTIC_PUSH
156+
HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
157+
return cam.getWaitForConfigInput();
158+
HEDLEY_DIAGNOSTIC_POP
159+
}, DOC(dai, node, Camera, getWaitForConfigInput))
160+
161+
.def("setPreviewKeepAspectRatio", &Camera::setPreviewKeepAspectRatio, py::arg("keep"), DOC(dai, node, Camera, setPreviewKeepAspectRatio))
162+
.def("getPreviewKeepAspectRatio", &Camera::getPreviewKeepAspectRatio, DOC(dai, node, Camera, getPreviewKeepAspectRatio))
163+
.def("setIspScale", static_cast<void(Camera::*)(int,int)>(&Camera::setIspScale), py::arg("numerator"), py::arg("denominator"), DOC(dai, node, Camera, setIspScale))
164+
.def("setIspScale", static_cast<void(Camera::*)(std::tuple<int,int>)>(&Camera::setIspScale), py::arg("scale"), DOC(dai, node, Camera, setIspScale, 2))
165+
.def("setIspScale", static_cast<void(Camera::*)(int,int,int,int)>(&Camera::setIspScale), py::arg("horizNum"), py::arg("horizDenom"), py::arg("vertNum"), py::arg("vertDenom"), DOC(dai, node, Camera, setIspScale, 3))
166+
.def("setIspScale", static_cast<void(Camera::*)(std::tuple<int,int>,std::tuple<int,int>)>(&Camera::setIspScale), py::arg("horizScale"), py::arg("vertScale"), DOC(dai, node, Camera, setIspScale, 4))
167+
.def("getIspSize", &Camera::getIspSize, DOC(dai, node, Camera, getIspSize))
168+
.def("getIspWidth", &Camera::getIspWidth, DOC(dai, node, Camera, getIspWidth))
169+
.def("getIspHeight", &Camera::getIspHeight, DOC(dai, node, Camera, getIspHeight))
170+
171+
.def("setPreviewNumFramesPool", &Camera::setPreviewNumFramesPool, DOC(dai, node, Camera, setPreviewNumFramesPool))
172+
.def("setVideoNumFramesPool", &Camera::setVideoNumFramesPool, DOC(dai, node, Camera, setVideoNumFramesPool))
173+
.def("setStillNumFramesPool", &Camera::setStillNumFramesPool, DOC(dai, node, Camera, setStillNumFramesPool))
174+
.def("setRawNumFramesPool", &Camera::setRawNumFramesPool, DOC(dai, node, Camera, setRawNumFramesPool))
175+
.def("setIspNumFramesPool", &Camera::setIspNumFramesPool, DOC(dai, node, Camera, setIspNumFramesPool))
176+
.def("setNumFramesPool", &Camera::setNumFramesPool, py::arg("raw"), py::arg("isp"), py::arg("preview"), py::arg("video"), py::arg("still"), DOC(dai, node, Camera, setNumFramesPool))
177+
178+
.def("getPreviewNumFramesPool", &Camera::getPreviewNumFramesPool, DOC(dai, node, Camera, getPreviewNumFramesPool))
179+
.def("getVideoNumFramesPool", &Camera::getVideoNumFramesPool, DOC(dai, node, Camera, getVideoNumFramesPool))
180+
.def("getStillNumFramesPool", &Camera::getStillNumFramesPool, DOC(dai, node, Camera, getStillNumFramesPool))
181+
.def("getRawNumFramesPool", &Camera::getRawNumFramesPool, DOC(dai, node, Camera, getRawNumFramesPool))
182+
.def("getIspNumFramesPool", &Camera::getIspNumFramesPool, DOC(dai, node, Camera, getIspNumFramesPool))
183+
.def("setCamera", &Camera::setCamera, py::arg("name"), DOC(dai, node, Camera, setCamera))
184+
.def("getCamera", &Camera::getCamera, DOC(dai, node, Camera, getCamera))
185+
;
186+
// ALIAS
187+
daiNodeModule.attr("Camera").attr("Properties") = cameraProperties;
188+
189+
}

src/pipeline/node/NodeBindings.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ py::class_<Map, holder_type> bindNodeMap(py::handle scope, const std::string &na
9494
void bind_xlinkin(pybind11::module& m, void* pCallstack);
9595
void bind_xlinkout(pybind11::module& m, void* pCallstack);
9696
void bind_colorcamera(pybind11::module& m, void* pCallstack);
97+
void bind_camera(pybind11::module& m, void* pCallstack);
9798
void bind_monocamera(pybind11::module& m, void* pCallstack);
9899
void bind_stereodepth(pybind11::module& m, void* pCallstack);
99100
void bind_neuralnetwork(pybind11::module& m, void* pCallstack);
@@ -122,6 +123,7 @@ void NodeBindings::addToCallstack(std::deque<StackFunction>& callstack) {
122123
callstack.push_front(bind_xlinkin);
123124
callstack.push_front(bind_xlinkout);
124125
callstack.push_front(bind_colorcamera);
126+
callstack.push_front(bind_camera);
125127
callstack.push_front(bind_monocamera);
126128
callstack.push_front(bind_stereodepth);
127129
callstack.push_front(bind_neuralnetwork);

0 commit comments

Comments
 (0)