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

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 に答える