想要从图像中获取绿色RGB通道的错误

时间:2017-11-01 17:01:02

标签: c++ opencv rgb

我一直在寻找使用OpenCV来分离RGB图层并仅提取图像的绿色层的方法,但是当我想运行从代码生成的可执行文件时,我已经获得了这些错误,我有的代码是这样的:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp> 
#include <stdio.h>

using namespace cv;
using namespace std;

Mat img, g, fin_img;
img = imread("img.png",CV_LOAD_IMAGE_COLOR);
vector<Mat> channels(3);

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

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

merge(channels, fin_img);
imshow("img", fin_img);
waitKey(0);
return 0;

错误是这样的:

  

OpenCV错误:合并中的断言失败(mv [i] .size == mv [0] .size&amp;&amp; mv [i] .depth()== depth),文件/ opt / opencv / modules / core / src / convert.cpp,第336行   在抛出'cv :: Exception'的实例后终止调用     what():/opt/opencv/modules/core/src/convert.cpp:336:错误:(-215)mv [i] .size == mv [0] .size&amp;&amp; mv [i] .depth()==功能合并中的深度

3 个答案:

答案 0 :(得分:3)

您首先要创建一个包含3个空矩阵的向量,然后再推回其他3个矩阵,得到6个不同大小的矩阵向量。

只需创建一个空矢量即可开始:

vector<Mat> channels;
g = Mat::zeros(Size(img.rows, img.cols), img.type());
channels.push_back(g);
channels.push_back(g);     
channels.push_back(img);

然而,您所做的并不是提取绿色通道。为此,您需要splitmerge,或者您可以使用as you say in your comment

cv::Mat green;
cv::extractChannel(image, green, 1);

答案 1 :(得分:1)

(猜测你给的大块头没有编译)

Mat black = Mat::zeros(rows, cols, src.type());

似乎不对,如果输入图像有3个通道,你想在这里使用单个通道,因此src.type()不能在这里使用。

答案 2 :(得分:0)

您应该使用split功能

Mat a = imread(path);
Mat channels[3];
split(a, channels);
imshow("Green", channels[1]);