Подтвердить что ты не робот

Объединение каналов в OpenCV

Мне нужно создать "красное" изображение из изображения в оттенках серого. Я использую этот код:

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

С некоторыми пояснениями:

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

in - входная матрица, выход.

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);

Создайте пустую матрицу с одинаковым размером и преобразуйте входное изображение в одноканальный 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);

Создайте вектор с тремя каналами, затем слейте их в 'out'.

Однако, когда я запускаю код, я получаю следующее сообщение:

     Using 3 channels

и следующее исключение:

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

Не могли бы вы мне помочь? С моей неопытной точки зрения тип изображений одинаковый, и количество каналов правильное.

4b9b3361

Ответ 1

Почему вы конвертируете изображение, если у вас есть изображение в оттенках серого?

Просто создайте две пустые матрицы одинакового размера для синего и зеленого.

И вы определили свою матрицу вывода как 1-канальную матрицу. Ваша выходная матрица должна содержать не менее 3-х каналов. (Синий, зеленый и красный). Где Blue и Green будут полностью пустыми, и вы поместите свое изображение в оттенках серого как красный канал выходного изображения.

#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;
}