[英]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.