(opencv)imread with CV_LOAD_IMAGE_GRAYSCALE产生4个频道Mat

时间:2016-09-14 13:43:29

标签: opencv image-processing

以下代码将文件中的图像读入cv::Mat对象。

#include <string>

#include <opencv2/opencv.hpp>

cv::Mat load_image(std::string img_path)
{
  cv::Mat img = cv::imread(img_path, CV_LOAD_IMAGE_GRAYSCALE);
  cv::Scalar intensity = img.at<uchar>(0, 0);
  std::cout << intensity << std::endl;
  return img;
}

我希望cv::Mat只有一个频道(即图像的强度),但它有4个。

$ ./test_load_image
[164, 0, 0, 0]

我也尝试用

转换图像
cv::Mat gray(img.size(), CV_8UC1);
img.convertTo(gray, CV_8UC1);

gray矩阵也是4通道矩阵。

我想知道是否可以使用单个频道cv::Mat。直观地说,这是我在处理灰度(因此,单通道)图像时所期望的。

1 个答案:

答案 0 :(得分:5)

矩阵是单通道。你只是以错误的方式读取值。

Scalar是一个包含4个值的结构。使用单个值构造Scalar将导致Scalar设置第一个值,剩余值设置为零。

在您的情况下,只有第一个值才有意义。 {0}默认为Scalar

但是,您不需要使用Scalar

uchar intensity = img.at<uchar>(0, 0);
std::cout << int(intensity) << std::endl; // Print the value, not the ASCII character