如何将RGB垫作为一维阵列进行访问?我查看了文档,但在这种情况下无法找到3通道数据的布局。
我尝试使用1 for for循环从n=0
到n = img.rows*img.cols - 1
遍历每个像素,并在每个像素处访问R,G和B值。
非常感谢任何帮助。
答案 0 :(得分:1)
我真的不明白为什么你真的只需要一个循环,所以我会为你提出几个选项(包括1或2个for循环),我知道这些选项是有效的。
如果您真的想以安全的方式仅使用一个循环迭代所有值,您可以使用cv::Mat::reshape(...)
(cv::Mat rgbMat = cv::imread(...); // Read original image
// As a 1D-1 channel, we have 1 channel and 3*the number of pixels samples
cv::Mat arrayFromRgb = rgbMat.reshape(1, rgbMat.channels()*rgbMat.size().area());
重新整形矩阵并将3通道2D图像转换为1通道1D阵列{3}}):
reshape()
有两点需要注意:
cv::Mat
会返回一个新的cv::Mat rgbMat = cv::imread(...);
for (int y = 0; y < rgbMat.size().height; ++y) {
// Option 1: get a pointer to a 3-channel element
cv::Vec3b* pointerToRgbPixel = rgbMat.ptr<cv::Vec3b>(y);
for (int x = 0; x < rgbMat.size().width; ++x, ++pointerToRgbPixel) {
uint8_t blue = (*pointerToRgbPixel )[0];
uint8_t green = (*pointerToRgbPixel )[1];
uint8_t red = (*pointerToRgbPixel )[2];
DoSomething(red, green, blue);
}
// Option 2: get a pointer to the first sample and iterate
uint8_t* pointerToSample = rgbMat.ptr<uint8_t>(y);
for (int x = 0; x < rgbMat.channels()*rgbMat.size().width; ++x) {
DoSomething(*pointerToSample);
++pointerToSample;
}
}
引用,因此需要将其输出分配给变量(它不会就地运行)OpenCV以行主顺序存储矩阵数据。 因此,另一种方法是通过获取指向每行开始的指针来迭代行。 这样,由于行末可能的填充数据,您不会做任何不安全的事情:
#pragma parallel for
为什么我喜欢行上的迭代? 因为很容易并行。 如果您有多核计算机,则可以使用任何框架(例如OpenMP或GCD)以安全的方式并行处理每一行。 使用OpenMP,就像在外部循环之前添加{{1}}一样简单。
答案 1 :(得分:0)
是的,文档中引用了over there。
为什么你没有看到下面的片段:
template<int N>
void SetPixel(Mat &img, int x, int y, unsigned char newVal) {
*(img.data + (y * img.cols + x) * img.channels() + N) = newVal;
}
int main() {
Mat img = Mat::zeros(1000, 1000, CV_8UC4);
SetPixel<0>(img, 120);
SetPixel<1>(img, 120);
SetPixel<2>(img, 120);
imwrite("out.jpg", img);
return 0;
}
但它不是安全的方式,它假设mat数据在momory中连续放置(并且其行之间没有字节空格)。因此,在使用此代码段之前,请更好地检查Mat :: isContinous()。
答案 2 :(得分:0)
//下面的C ++代码
//您的RGB图像
cv :: Mat image;
//你的一维数组
cv :: Mat newimage;
//将图像转换为1D数组的功能
image.reshape(0,1).convertTo(newimage,CV_32F);
// http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-reshape