17

グレースケール画像から「赤」の画像を作成する必要があります。私はこのコードを使用しています:

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は出力です。

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

3つのチャネルを持つベクトルを作成し、それらを「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

手伝っていただけませんか?私の経験の浅い観点からは、画像の種類は同じで、チャンネル数は正しいです。

4

1 に答える 1

24

グレースケール画像が存在する場合、なぜ画像を変換するのですか?

Blue と Green に対して同じサイズの空の行列を 2 つ作成するだけです。

そして、出力マトリックスを 1 チャネル マトリックスとして定義しました。出力マトリックスには、少なくとも 3 つのチャネルが含まれている必要があります。(青、緑、赤)。青と緑が完全に空になり、グレースケール画像を出力画像の赤チャンネルとして配置します。

#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;
}
于 2013-01-29T13:54:14.563 に答える