OpenCV 中 cv::split() 的最基础用法

OpenCV 中 cv::split() 的最基础用法

一、cv::split() 是干什么的?

一句话:把一张多通道图像,拆成好几个单通道图像。

比如:

  • 3通道彩色图(RGB/BGR) → 拆成 R、G、B 三张灰度图
  • 4通道带透明度 → 拆成 R、G、B、A

二、最基本用法(标准格式)

cpp 复制代码
// 把 image 拆分成多个单通道图像,放进 channels 里
void cv::split(
    const cv::Mat& image,          // 输入:多通道图像(比如3通道彩色图)
    std::vector<cv::Mat>& channels // 输出:每个单通道图像(vector装)
);

三、超级简单例子(一看就会)

例子1:把彩色图拆成 R、G、B

cpp 复制代码
// 1. 读取一张彩色图片
cv::Mat image = cv::imread("test.jpg");  // 3通道 BGR

// 2. 创建一个vector,用来装拆出来的3个通道
vector<cv::Mat> channels;

// 3. 拆分!
cv::split(image, channels);

// 现在:
// channels[0] = B 通道(灰度图)
// channels[1] = G 通道(灰度图)
// channels[2] = R 通道(灰度图)

结果:

一张彩色图 → 变成 三张灰度图


四、另一种写法(数组写法)

你代码里用的就是这种:

cpp 复制代码
cv::Mat channels[3];
cv::split(image, channels);

效果完全一样,只是用数组存。


五、最重要的知识点(你必须懂)

split 做了什么?

输入图像(3通道)的内存排布:

复制代码
B G B G B G B G ...

split 之后:

复制代码
channels[0] = B B B B B B
channels[1] = G G G G G G
channels[2] = R R R R R R

一句话:

split 把交织在一起的通道,分开成连续的单通道。


六、你现在再看你原来的代码

cpp 复制代码
// 1. 先给 ms 里每个 mat 绑定好 Tensor 的内存地址(只是指路)
ms[i] = cv::Mat(height, width, CV_32F, cpu<float>(n, i));

// 2. 然后 split 把图像拆开放进这些地址里!
cv::split(image, &ms[0]);

现在是不是彻底懂了?

  1. 先准备好 3 个空的单通道 Mat(指向Tensor)
  2. split 把彩色图拆开,直接写入这 3 个 Mat
  3. 因为 Mat 指向 Tensor,所以数据直接进 Tensor!

超级精简总结

cv::split(输入多通道图, 输出单通道数组)

功能:把彩色图拆成 R、G、B 三个灰度图

你代码里的用途:拆通道 + 直接写入Tensor内存

相关推荐
andafaAPS3 小时前
安达发|aps高级排产:电动工具行业智能制造的核心引擎
大数据·人工智能·制造·安达发aps·aps高级排产·aps自动排产
大模型最新论文速读3 小时前
05-29 · LLM 最新论文速览
论文阅读·人工智能·深度学习·机器学习·自然语言处理
杀生丸学AI3 小时前
【三维重建】RT-Splatting:基于3DGS的联合反射-透射建模(CVPR 2026)
人工智能·深度学习·3d·三维重建·高斯泼溅·动态重建·镜面反射
STRUGGLE_xlf3 小时前
Codex × PPT Skill:一句话生成演示文稿
人工智能·powerpoint·智能体
人工智能AI技术3 小时前
深度拆解Opus 4.8:Dynamic Workflows重构AI开发模式
人工智能
码农天天3 小时前
轻人力运营实践:中小企业如何通过AI智能体矩阵实现组织重构?
大数据·人工智能·时序数据库
数据法师3 小时前
Oh My PPT技术深度解析:本地优先的开源AI幻灯片生成器,重新定义“人机协同”式创作
人工智能·开源·powerpoint
波动几何3 小时前
数字产品全栈构建——工作流重构记录
人工智能
nnsix3 小时前
PS中存储PNG时的“交错”选项是什么意思
人工智能
ComPDFKit3 小时前
使用AI Agent自动化生成订单/发票/合同:从自然语言到PDF的一站式方案
人工智能·chatgpt·智能合约