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

tgy*_*tgy 0 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;
}
Run Code Online (Sandbox Code Playgroud)

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

$ ./test_load_image
[164, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

我也试过转换图像

cv::Mat gray(img.size(), CV_8UC1);
img.convertTo(gray, CV_8UC1);
Run Code Online (Sandbox Code Playgroud)

gray矩阵也是一个4通道.

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

Mik*_*iki 5

矩阵是单通道.你只是以错误的方式阅读价值观.

Scalar是一个有4个值的结构.Scalar使用单个值构造a 将导致a Scalar设置为第一个值,剩余部分设置为零.

在您的情况下,只有第一个值是有意义的.零默认为Scalar.

但是,您不需要使用Scalar:

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