# ColorCamera

ColorCamera 节点是 [ImgFrame](https://docs.luxonis.com/software/depthai-components/messages/img_frame.md) 的源。您可以在运行时通过 InputControl 和
InputConfig 对其进行控制。

## 如何放置

#### Python

```python
pipeline = dai.Pipeline()
cam = pipeline.create(dai.node.ColorCamera)
```

#### C++

```cpp
dai::Pipeline pipeline;
auto cam = pipeline.create<dai::node::ColorCamera>();
```

## 输入和输出

消息类型

 * inputConfig - [ImageManipConfig](https://docs.luxonis.com/software/depthai-components/messages/image_manip_config.md)
 * inputControl - [CameraControl](https://docs.luxonis.com/software/depthai-components/messages/camera_control.md)
 * raw - [ImgFrame](https://docs.luxonis.com/software/depthai-components/messages/img_frame.md) - RAW10 Bayer
   数据。解包示例代码在[此处](https://github.com/luxonis/oak-examples/blob/3f1b2b2/gen2-color-isp-raw/main.py#L13-L32)
 * isp - [ImgFrame](https://docs.luxonis.com/software/depthai-components/messages/img_frame.md) - YUV420 平面格式（与 YU12/IYUV/I420 相同）
 * still - [ImgFrame](https://docs.luxonis.com/software/depthai-components/messages/img_frame.md) - NV12，适用于较大尺寸的帧。当发送捕获事件给
   ColorCamera 时生成图像，类似于拍照
 * preview - [ImgFrame](https://docs.luxonis.com/software/depthai-components/messages/img_frame.md) - RGB（或 BGR
   平面/交错格式，取决于配置），主要用于小尺寸预览，并将图像输入到 [NeuralNetwork](https://docs.luxonis.com/software/depthai-components/nodes/neural_network.md)
 * video - [ImgFrame](https://docs.luxonis.com/software/depthai-components/messages/img_frame.md) - NV12，适用于较大尺寸的帧

ISP（图像信号处理器）用于 Bayer 变换、去马赛克、降噪以及其他图像增强。 它与 3A 算法交互：自动对焦、自动曝光和自动白平衡，这些算法在运行时处理图像传感器 的调整，如曝光时间、灵敏度（ISO）和镜头位置（如果相机模块有电机驱动镜头）。
点击[此处](https://en.wikipedia.org/wiki/Image_processor)了解更多信息。

图像后处理将来自 ISP 的 YUV420 平面帧转换为 video/preview/still 帧。

still（当触发捕获时）和 isp 以最大相机分辨率工作，而 video 和 preview 限制为 最大 4K（3840 x 2160）分辨率，这是从 isp 裁剪得到的。 对于 IMX378（12MP），后处理的工作方式如下：

上图是 ColorCamera 的 isp 输出（来自 IMX378 的 12MP 分辨率）。如果您不缩小 ISP， 则 video 输出被裁剪为 4K（由于 video 输出的限制，最大 3840x2160），如 蓝色矩形所示。黄色矩形表示当预览大小设置为
1:1 宽高比时裁剪的 preview 输出 （例如，针对 MobileNet-SSD NN 模型使用 300x300 预览大小），因为 preview 输出源自 video 输出。

## 用法

#### Python

```python
pipeline = dai.Pipeline()
cam = pipeline.create(dai.node.ColorCamera)
cam.setPreviewSize(300, 300)
cam.setBoardSocket(dai.CameraBoardSocket.CAM_A)
cam.setResolution(dai.ColorCameraProperties.SensorResolution.THE_1080_P)
cam.setInterleaved(False)
cam.setColorOrder(dai.ColorCameraProperties.ColorOrder.RGB)
```

#### C++

```cpp
dai::Pipeline pipeline;
auto cam = pipeline.create<dai::node::ColorCamera>();
cam->setPreviewSize(300, 300);
cam->setBoardSocket(dai::CameraBoardSocket::CAM_A);
cam->setResolution(dai::ColorCameraProperties::SensorResolution::THE_1080_P);
cam->setInterleaved(false);
cam->setColorOrder(dai::ColorCameraProperties::ColorOrder::RGB);
```

## 3A 算法

3A（自动曝光 AE、自动白平衡 AWB 和自动对焦 AF）算法用于优化图像质量，并直接在 RVC 上运行。

默认情况下，这些设置处于自动模式，每个传感器都有特定的限制（例如最小/最大曝光），详见[支持的传感器](https://docs.luxonis.com/hardware/platform/sensors/sensors.md)。

您可以通过以下方式手动控制这些设置：按照 [RGB 相机控制示例](https://docs.luxonis.com/software/depthai/examples/rgb_camera_control.md) 中的步骤操作，或使用
[cam_test.py 脚本](https://github.com/luxonis/depthai-python/blob/main/utilities/cam_test.py)。

 * 立体相机：传感器共享同一条 I2C 总线，可自动同步 3A 设置（AWB、AE）。
 * 独立传感器：在 OAK FFC 或 OAK-D-LR 等配置中，每个传感器拥有独立的 I2C，可使用 3a-follow 功能将 3A 设置从一个传感器同步到其他传感器。

示例用法

```python
cam['cam_b'].initialControl.setMisc("3a-follow", dai.CameraBoardSocket.CAM_A)
cam['cam_c'].initialControl.setMisc("3a-follow", dai.CameraBoardSocket.CAM_A)
```

3a-follow 功能将主摄像头（例如 CAM_A）的 3A 设置（曝光、ISO 和白平衡）复制到配置中的其他摄像头（例如 CAM_B 和 CAM_C）。

## 限制

以下是已知的针对 [RVC2](https://docs.luxonis.com/hardware/platform/rvc/rvc2.md#rvc2) 的相机限制：

 * ISP 大约能处理 600 MP/s，当流水线同时运行神经网络和视频编码器时，大约为 500 MP/s
 * 3A 算法总共能处理约 200..250 FPS（针对所有相机流）。这是我们当前实现的限制，我们计划通过变通方法在每第 X 帧上运行 3A 算法，暂无预计时间
 * ISP 缩放分子值可为 1..16，分母值可为 1..32（垂直和水平缩放）。因此，您只能将例如
   12MP（4056x3040）缩小为[此处计算的分辨率](https://docs.google.com/spreadsheets/d/153yTstShkJqsPbkPOQjsVRmM8ZO3A6sCqm7uayGF-EE/edit#gid=0)

## 功能示例

 * [RGB 预览](https://docs.luxonis.com/software/depthai/examples/rgb_preview.md)
 * [RGB 相机控制](https://docs.luxonis.com/software/depthai/examples/rgb_camera_control.md)
 * [RGB 视频](https://docs.luxonis.com/software/depthai/examples/rgb_video.md)

## 参考

### depthai.node.ColorCamera(depthai.Node)

Kind: Class

ColorCamera node. For use with color sensors.

#### getBoardSocket(self) -> depthai.CameraBoardSocket: depthai.CameraBoardSocket

Kind: Method

Retrieves which board socket to use

Returns:
Board socket to use

#### getCamId(self) -> int: int

Kind: Method

#### getCamera(self) -> str: str

Kind: Method

Retrieves which camera to use by name

Returns:
Name of the camera to use

#### getColorOrder(self) -> depthai.ColorCameraProperties.ColorOrder: depthai.ColorCameraProperties.ColorOrder

Kind: Method

Get color order of preview output frames. RGB or BGR

#### getFp16(self) -> bool: bool

Kind: Method

Get fp16 (0..255) data of preview output frames

#### getFps(self) -> float: float

Kind: Method

Get rate at which camera should produce frames

Returns:
Rate in frames per second

#### getFrameEventFilter(self) -> list[depthai.FrameEvent]: list[depthai.FrameEvent]

Kind: Method

#### getImageOrientation(self) -> depthai.CameraImageOrientation: depthai.CameraImageOrientation

Kind: Method

Get camera image orientation

#### getInterleaved(self) -> bool: bool

Kind: Method

Get planar or interleaved data of preview output frames

#### getIspHeight(self) -> int: int

Kind: Method

Get 'isp' output height

#### getIspNumFramesPool(self) -> int: int

Kind: Method

Get number of frames in isp pool

#### getIspSize(self) -> tuple[int, int]: tuple[int, int]

Kind: Method

Get 'isp' output resolution as size, after scaling

#### getIspWidth(self) -> int: int

Kind: Method

Get 'isp' output width

#### getPreviewHeight(self) -> int: int

Kind: Method

Get preview height

#### getPreviewKeepAspectRatio(self) -> bool: bool

Kind: Method

See also:
setPreviewKeepAspectRatio

Returns:
Preview keep aspect ratio option

#### getPreviewNumFramesPool(self) -> int: int

Kind: Method

Get number of frames in preview pool

#### getPreviewSize(self) -> tuple[int, int]: tuple[int, int]

Kind: Method

Get preview size as tuple

#### getPreviewWidth(self) -> int: int

Kind: Method

Get preview width

#### getRawNumFramesPool(self) -> int: int

Kind: Method

Get number of frames in raw pool

#### getResolution(self) -> depthai.ColorCameraProperties.SensorResolution: depthai.ColorCameraProperties.SensorResolution

Kind: Method

Get sensor resolution

#### getResolutionHeight(self) -> int: int

Kind: Method

Get sensor resolution height

#### getResolutionSize(self) -> tuple[int, int]: tuple[int, int]

Kind: Method

Get sensor resolution as size

#### getResolutionWidth(self) -> int: int

Kind: Method

Get sensor resolution width

#### getSensorCrop(self) -> tuple[float, float]: tuple[float, float]

Kind: Method

Returns:
Sensor top left crop coordinates

#### getSensorCropX(self) -> float: float

Kind: Method

Get sensor top left x crop coordinate

#### getSensorCropY(self) -> float: float

Kind: Method

Get sensor top left y crop coordinate

#### getStillHeight(self) -> int: int

Kind: Method

Get still height

#### getStillNumFramesPool(self) -> int: int

Kind: Method

Get number of frames in still pool

#### getStillSize(self) -> tuple[int, int]: tuple[int, int]

Kind: Method

Get still size as tuple

#### getStillWidth(self) -> int: int

Kind: Method

Get still width

#### getVideoHeight(self) -> int: int

Kind: Method

Get video height

#### getVideoNumFramesPool(self) -> int: int

Kind: Method

Get number of frames in video pool

#### getVideoSize(self) -> tuple[int, int]: tuple[int, int]

Kind: Method

Get video size as tuple

#### getVideoWidth(self) -> int: int

Kind: Method

Get video width

#### getWaitForConfigInput(self) -> bool: bool

Kind: Method

See also:
setWaitForConfigInput

Returns:
True if wait for inputConfig message, false otherwise

#### sensorCenterCrop(self)

Kind: Method

Specify sensor center crop. Resolution size / video size

#### setBoardSocket(self, boardSocket: depthai.CameraBoardSocket)

Kind: Method

Specify which board socket to use

Parameter ``boardSocket``:
Board socket to use

#### setCamId(self, arg0: typing.SupportsInt)

Kind: Method

#### setCamera(self, name: str)

Kind: Method

Specify which camera to use by name

Parameter ``name``:
Name of the camera to use

#### setColorOrder(self, colorOrder: depthai.ColorCameraProperties.ColorOrder)

Kind: Method

Set color order of preview output images. RGB or BGR

#### setFp16(self, fp16: bool)

Kind: Method

Set fp16 (0..255) data type of preview output frames

#### setFps(self, fps: typing.SupportsFloat)

Kind: Method

Set rate at which camera should produce frames

Parameter ``fps``:
Rate in frames per second

#### setFrameEventFilter(self, events: collections.abc.Sequence [ depthai.FrameEvent ])

Kind: Method

#### setImageOrientation(self, imageOrientation: depthai.CameraImageOrientation)

Kind: Method

Set camera image orientation

#### setInterleaved(self, interleaved: bool)

Kind: Method

Set planar or interleaved data of preview output frames

#### setIsp3aFps(self, isp3aFps: typing.SupportsInt)

Kind: Method

Isp 3A rate (auto focus, auto exposure, auto white balance, camera controls
etc.). Default (0) matches the camera FPS, meaning that 3A is running on each
frame. Reducing the rate of 3A reduces the CPU usage on CSS, but also increases
the convergence rate of 3A. Note that camera controls will be processed at this
rate. E.g. if camera is running at 30 fps, and camera control is sent at every
frame, but 3A fps is set to 15, the camera control messages will be processed at
15 fps rate, which will lead to queueing.

#### setIspNumFramesPool(self, arg0: typing.SupportsInt)

Kind: Method

Set number of frames in isp pool

#### setIspScale()

Kind: Method

#### setNumFramesPool(self, raw: typing.SupportsInt, isp: typing.SupportsInt, preview: typing.SupportsInt, video:
typing.SupportsInt, still: typing.SupportsInt)

Kind: Method

Set number of frames in all pools

#### setPreviewKeepAspectRatio(self, keep: bool)

Kind: Method

Specifies whether preview output should preserve aspect ratio, after downscaling
from video size or not.

Parameter ``keep``:
If true, a larger crop region will be considered to still be able to create
the final image in the specified aspect ratio. Otherwise video size is
resized to fit preview size

#### setPreviewNumFramesPool(self, arg0: typing.SupportsInt)

Kind: Method

Set number of frames in preview pool

#### setPreviewSize()

Kind: Method

#### setRawNumFramesPool(self, arg0: typing.SupportsInt)

Kind: Method

Set number of frames in raw pool

#### setRawOutputPacked(self, packed: bool)

Kind: Method

Configures whether the camera `raw` frames are saved as MIPI-packed to memory.
The packed format is more efficient, consuming less memory on device, and less
data to send to host: RAW10: 4 pixels saved on 5 bytes, RAW12: 2 pixels saved on
3 bytes. When packing is disabled (`false`), data is saved lsb-aligned, e.g. a
RAW10 pixel will be stored as uint16, on bits 9..0: 0b0000'00pp'pppp'pppp.
Default is auto: enabled for standard color/monochrome cameras where ISP can
work with both packed/unpacked, but disabled for other cameras like ToF.

#### setResolution(self, resolution: depthai.ColorCameraProperties.SensorResolution)

Kind: Method

Set sensor resolution

#### setSensorCrop(self, x: typing.SupportsFloat, y: typing.SupportsFloat)

Kind: Method

Specifies the cropping that happens when converting ISP to video output. By
default, video will be center cropped from the ISP output. Note that this
doesn't actually do on-sensor cropping (and MIPI-stream only that region), but
it does postprocessing on the ISP (on RVC).

Parameter ``x``:
Top left X coordinate

Parameter ``y``:
Top left Y coordinate

#### setStillNumFramesPool(self, arg0: typing.SupportsInt)

Kind: Method

Set number of frames in preview pool

#### setStillSize()

Kind: Method

#### setVideoNumFramesPool(self, arg0: typing.SupportsInt)

Kind: Method

Set number of frames in preview pool

#### setVideoSize()

Kind: Method

#### setWaitForConfigInput(self, wait: bool)

Kind: Method

Specify to wait until inputConfig receives a configuration message, before
sending out a frame.

Parameter ``wait``:
True to wait for inputConfig message, false otherwise

#### frameEvent

Kind: Property

Outputs metadata-only ImgFrame message as an early indicator of an incoming
frame.

It's sent on the MIPI SoF (start-of-frame) event, just after the exposure of the
current frame has finished and before the exposure for next frame starts. Could
be used to synchronize various processes with camera capture. Fields populated:
camera id, sequence number, timestamp

#### initialControl

Kind: Property

Initial control options to apply to sensor

#### inputConfig

Kind: Property

Input for ImageManipConfig message, which can modify crop parameters in runtime

Default queue is non-blocking with size 8

#### inputControl

Kind: Property

Input for CameraControl message, which can modify camera parameters in runtime

Default queue is blocking with size 8

#### isp

Kind: Property

Outputs ImgFrame message that carries YUV420 planar (I420/IYUV) frame data.

Generated by the ISP engine, and the source for the 'video', 'preview' and
'still' outputs

#### preview

Kind: Property

Outputs ImgFrame message that carries BGR/RGB planar/interleaved encoded frame
data.

Suitable for use with NeuralNetwork node

#### raw

Kind: Property

Outputs ImgFrame message that carries RAW10-packed (MIPI CSI-2 format) frame
data.

Captured directly from the camera sensor, and the source for the 'isp' output.

#### still

Kind: Property

Outputs ImgFrame message that carries NV12 encoded (YUV420, UV plane
interleaved) frame data.

The message is sent only when a CameraControl message arrives to inputControl
with captureStill command set.

#### video

Kind: Property

Outputs ImgFrame message that carries NV12 encoded (YUV420, UV plane
interleaved) frame data.

Suitable for use with VideoEncoder node

### 需要帮助？

请前往 [OAKChina 官网](https://www.oakchina.cn/) 获取技术支持或解答您的任何疑问。
