OpenCVにおけるcvtColor回転階調マップのチャネル数

3103 ワード

OpenCVは階調マップを回転させるときにcvtcolorによく使われますが、このような階調マップを回転させる方法が3チャネルの階調マップを生成することを発見することがありますか?
テストは次のとおりです.
Mat firstpic = imread("IMG.JPG");
cout << "channnels : " << firstpic.channels() << endl;    //   channels:3
Mat pic2(firstpic.rows, firstpic.cols, CV_8UC1);// 
cvtColor(firstpic, pic2, CV_BGR2GRAY);// pic2 
cvtColor(firstpic, firstpic, CV_BGR2GRAY);// fistpic 
cout << "channnels : " << dep1.channels()<

このことから、cvtcolorが階調図に変換されたときにチャネル数が1になった.しかし、なぜ後続の操作中に再び読み取ると3チャネルになるのでしょうか.
テストは次のとおりです.
Mat depthpic = imread("pic2.bmp");    //  Mat pic2
cout << "channnels : " << depthpic.channels() << endl;    //   channels:3

問題はimread,OpenCVにおけるimreadプロトタイプです.
Mat imread( const String& filename, int flags = IMREAD_COLOR );

ここでflagsは無視されがちですが、以下のように定義されています.
//! Imread flags
enum ImreadModes {
       IMREAD_UNCHANGED            = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
       IMREAD_GRAYSCALE            = 0,  //!< If set, always convert image to the single channel grayscale image.
       IMREAD_COLOR                = 1,  //!< If set, always convert image to the 3 channel BGR color image.
       IMREAD_ANYDEPTH             = 2,  //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
       IMREAD_ANYCOLOR             = 4,  //!< If set, the image is read in any possible color format.
       IMREAD_LOAD_GDAL            = 8,  //!< If set, use the gdal driver for loading the image.
       IMREAD_REDUCED_GRAYSCALE_2  = 16, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2.
       IMREAD_REDUCED_COLOR_2      = 17, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.
       IMREAD_REDUCED_GRAYSCALE_4  = 32, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4.
       IMREAD_REDUCED_COLOR_4      = 33, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.
       IMREAD_REDUCED_GRAYSCALE_8  = 64, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8.
       IMREAD_REDUCED_COLOR_8      = 65, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.
       IMREAD_IGNORE_ORIENTATION   = 128 //!< If set, do not rotate the image according to EXIF's orientation flag.
     };

flagsのデフォルト値は1なので、画像を読み込むときにデフォルトで3チャネルBGB形式を読み込むので、画像のフォーマットを読み取る方法を指定することでチャネル数を制御することができます.
Mat depthpic = imread("pic2.bmp", -1);    //flags=-1  ,flags=0 。 
cout << "channnels : " << depthpic.channels() << endl;    //   channels:1