3

我调用函数 rgbTOgray 并尝试使用 for 循环将“图像矢量”(这是彩色图像的矢量)中的每个图像复制到临时 cv::Mat 中。并且,使用 cvtColor 将其转换为灰度。这是代码:

std::vector<cv::Mat> rgbTOgray(std::vector<cv::Mat>& rgb_image)
{
  cv::Mat temp_gray, temp_rgb;
  std::vector<cv::Mat> gray_image;
  std::vector<cv::Mat>::iterator itr;

  for ( itr = rgb_image.begin() ; itr < rgb_image.end() ; itr++) 
  {
    temp_rgb = *itr;
    cvtColor(temp_rgb, temp_gray, CV_RGB2GRAY);
    gray_image.push_back(temp_gray);
  }

  return gray_image;
}

编辑:我正在返回灰度图像“gray_image”的矢量。但这似乎不起作用。

EDIT_2: OpenCV 错误:在 cvtColor 中断言失败 (scn == 3 || scn == 4)

有人可以帮我吗?我是新手,正在学习所有这些东西。谢谢!

4

3 回答 3

4

一个问题是您忘记了cv::Mat使用“副本”进行引用计数,而不是真正复制任何内容,只是一个指针。不断将相同的图像推送到您的阵列中
。 您应该在循环内声明以确保您获得每个元素的新副本。 push_back(temp_grey)
cv::Mat temp_gray

此外,检查“rgb”图像的通道数(temp_rgb.channels())。断言基本上说它们不是 3/4 通道。

于 2013-06-04T12:58:57.463 回答
4

您不是将gray_image灰度图像存储在向量中,而是cv::Mat带有指向单个内存数据块的指针的标题,该内存数据首先由temp_gray. 您必须克隆这些数据以不覆盖您的图像:

gray_image.push_back(temp_gray.clone());

顺便说一句,我会gray_image.reserve(rgb_image.size());在你的循环之前添加。

于 2013-06-04T12:55:59.263 回答
0

我不知道确切的原因(我也是一个学习者),但在我的情况下,它只适用于.clone()当你推回临时图像只是灰度转换时。

无论如何,代码中的迭代器行是正确的。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

std::vector<cv::Mat> rgb2gray(std::vector<cv::Mat>& rgb_image)
{
  cv::Mat temp_gray;
  std::vector<cv::Mat> gray_image;
  std::vector<cv::Mat>::iterator itr;

  gray_image.reserve(rgb_image.size());
  for ( itr = rgb_image.begin() ; itr < rgb_image.end() ; itr++)
  {
    cvtColor(*itr, temp_gray, CV_RGB2GRAY);
    gray_image.push_back(temp_gray.clone());
  }
  return gray_image;
}

int main(int /*argc*/, char** /*argv*/) {
    Mat imgA, imgB;   
    imgA = imread("test1.jpg");
    imgB = imread("test2.jpg");

    vector<Mat> input;
    input.push_back(imgA);
    input.push_back(imgB);

    vector<Mat> output;
    output = rgb2gray(input);

    stringstream ss;
    for(size_t i = 0; i<input.size(); i++) {
        ss.str(""); ss << "in" << i;
        imshow( ss.str(), input[i] );

        ss.str(""); ss << "out" << i;
        imshow( ss.str(), output[i] );
    }

    while( true ) {
        char c = (char)waitKey(10);
        if( c == 27 )
            { break; }
    }
    return 0;
}
于 2013-06-04T20:53:16.107 回答