加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 合并OpenCV中的频道

发布时间:2020-12-16 06:00:37 所属栏目:百科 来源:网络整理
导读:我需要从灰度图像创建一个“红色”图像.我正在使用这段代码: 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,CV_8UC1); Mat tmp; in.convertTo(tmp,CV_8UC1); vectorMat ch;
我需要从灰度图像创建一个“红色”图像.我正在使用这段代码:
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,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,CV_8UC1);

分配一些空间(可能是无用的,但我的尝试的一部分)

Mat zeros = Mat::zeros(in.rows,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

你可以帮我吗?从我没有经验的观点来看,图像的类型是相同的,并且通道的数量是正确的.

解决方法

如果您有灰度图像,您为什么要转换图像?

只需为蓝色和绿色创建相同大小的两个空矩阵.

您将输出矩阵定义为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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读