Merging channels in OpenCV

I need to create a 'red' image from a grayscale image. I am using this code:

void build_red(const cv::Mat& in, cv::Mat& out) {
    out = Mat::zeros(in.rows, in.cols, CV_8UC1);

    Mat zeros = Mat::zeros(in.rows, in.cols, CV_8UC1);
    Mat tmp;
    in.convertTo(tmp, CV_8UC1);

    vector<Mat> ch;
    ch.push_back(zeros);
    ch.push_back(zeros);
    ch.push_back(tmp);

    cout << "Using " << ch.size() << " channels" << endl;
    merge(ch, out);
} // build_red

With some explanations:

void build_red(const cv::Mat& in, cv::Mat& out) {

in is the input matrix, out the output.

out = Mat::zeros(in.rows, in.cols, CV_8UC1);

allocate some space for out (may be useless, but part of my attempts)

    Mat zeros = Mat::zeros(in.rows, in.cols, CV_8UC1);
    Mat tmp;
    in.convertTo(tmp, CV_8UC1);

Create an empty matrix with the same size and convert the input image to single-channel uchar.

    vector<Mat> ch;
    ch.push_back(zeros);
    ch.push_back(zeros);
    ch.push_back(tmp);

    cout << "Using " << ch.size() << " channels" << endl;
    merge(ch, out);

Create a vector with three channels, then merge them into 'out'.

However, when I run the code I get the following message:

     Using 3 channels

and the following exception:

OpenCV Error: Bad number of channels (Source image must have 1, 3 or 4 channels) 
in cvConvertImage, file /[...]/libs/OpenCV-2.4.0/modules/highgui/src/utils.cpp, 
line 611
terminate called after throwing an instance of 'cv::Exception'
what():  /[...]/libs/OpenCV-2.4.0/modules/highgui/src/utils.cpp:611: 
error: (-15) Source image must have 1, 3 or 4 channels in function cvConvertImage

Could you please help me? From my inexperienced point of view, the type of the images is the same and the number of channels is correct.


Why are you converting the image if you have a grayscale image present?

Just create two empty matrix of the same size for Blue and Green.

And you have defined your output matrix as 1 channel matrix. Your output matrix must contain at least 3 channels. (Blue, Green and Red). Where Blue and Green will be completely empty and you put your grayscale image as Red channel of the output image.

#include <opencv2/highgui/highgui.hpp> 
#include <stdio.h>
using namespace std;
using namespace cv;

int main()
{
    Mat img, g, fin_img;
    img = imread("Lenna.png",CV_LOAD_IMAGE_GRAYSCALE);
    vector<Mat> channels;

    g = Mat::zeros(Size(img.rows, img.cols), CV_8UC1);

    channels.push_back(g);
    channels.push_back(g);
    channels.push_back(img);

    merge(channels, fin_img);
    imshow("img", fin_img);
    waitKey(0);
    return 0;
}
链接地址: http://www.djcxy.com/p/67006.html

上一篇: 使用OpenCV和SVM与图像

下一篇: 合并OpenCV中的通道