簡體   English   中英

如何將單個圖像從圖像矢量復制到臨時的cv :: Mat?

[英]How to copy single image from vector of images to a temporary cv::Mat?

我調用函數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)

有人可以幫幫我嗎? 我是新手並且學習所有這些東西。 謝謝!

您不是將灰色圖像存儲在矢量gray_image中,而是存儲指向單個內存數據塊的指針的cv::Mat頭,這些內存數據首先由temp_gray分配。 您必須克隆這些數據才能覆蓋您的圖像:

gray_image.push_back(temp_gray.clone());

順便說一句,我會添加gray_image.reserve(rgb_image.size()); 循環之前。

一個問題是你忘記了cv::Mat是用“副本”計數的引用而不是真正復制任何東西,只是一個指針。
push_back(temp_grey)不斷將相同的圖像推送到您的數組中。
你應該在循環中聲明cv::Mat temp_gray ,以確保你獲得每個元素的新副本。

另外,檢查“rgb”圖像的通道數( temp_rgb.channels() )。 斷言基本上說它們不是3/4通道。

我不確切知道為什么(我也是學習者),但在我的情況下,當你推回臨時圖像只是灰色轉換時它只適用於.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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM