cv::cvtColor将cv::Mat由单通道转化成三通道?
时间: 2024-09-06 18:00:20 浏览: 53
当你有一个单通道(如灰度图像)的`cv::Mat`,而你需要将其转换为三个通道(通常用于BGR或RGB表示的彩色图像),OpenCV的`cvtColor()`函数并不能直接完成这样的工作,因为它默认的转换是从多通道到单通道。在这种情况下,你需要先创建一个新的多通道图像,然后将每个像素复制到所有通道上。
以下是具体的代码示例:
```cpp
cv::Mat gray_img = ...; // 单通道灰度图像
cv::Mat rgb_img(gray_img.size(), CV_8UC3); // 创建一个新的3通道图像
for (int y = 0; y < gray_img.rows; ++y) {
for (int x = 0; x < gray_img.cols; ++x) {
int index = y * gray_img.step + x * gray_img.elemSize(); // 计算灰度值索引
rgb_img.at<cv::Vec3b>(y, x)[0] = gray_img.at<uchar>(index); // B通道
rgb_img.at<cv::Vec3b>(y, x)[1] = gray_img.at<uchar>(index); // G通道
rgb_img.at<cv::Vec3b>(y, x)[2] = gray_img.at<uchar>(index); // R通道
}
}
// 或者更简洁地,使用Mat的复制操作:
rgb_img.setTo(cv::Vec3b(gray_img.at<uchar>(index), gray_img.at<uchar>(index), gray_img.at<uchar>(index)));
```
阅读全文