4

我正在使用 OpenCV 处理 C++ 中的图像。

我用二维的 uchar 数组编写了代码,我可以在其中读取图像的像素值,使用 imread 以灰度方式上传.at< uchar>(i,j)

但是我想对彩色图像做同样的事情。因为我知道要访问我现在需要的像素值,.at< Vec3b>(i,j)[0]所以我制作了一个类似的二维数组。.at< Vec3b>(i,j)[1].at< Vec3b>(i,j)[2]Vec3b

但我不知道如何用像素值填充这个数组。它必须是一个二维数组。

我试过:

array[width][height].val[0]=img.at< Vec3b>(i,j)[0]

但这没有用。

在 OpenCV 文档或这里都没有找到答案。

有人有想法吗?

我已经包含了我的一些代码。我需要一个数组,因为我已经让我的整个算法使用数组来处理只有一个通道的灰度图像。

灰度代码是这样的:

for(int i=0;i<height;i++){
    for(int j=0;j<width;j++){
        image_data[i*width+j]=all_images[nb_image-1].at< uchar>(i,j);
    }
}

我从哪里读到:

std::vector< cv::Mat> all_images

每个图像(我有一个长序列),检索 uchar 数组中的像素值image_data,并处理它们。

我现在想做同样的事情,但对于 RGB 图像,我无法读取每个通道的数据像素并将它们放入数组中。

这次 image_data 是一个 Vec3b 数组,我正在尝试的代码如下所示:

for(int i=0;i<height;i++){
    for(int j=0;j<width;j++){
        image_data[0][i*width+j]=all_images[nb_image-1].at<cv::Vec3b>(i,j)[2];
        image_data[1][i*width+j]=all_images[nb_image-1].at<cv::Vec3b>(i,j)[1];
        image_data[2][i*width+j]=all_images[nb_image-1].at<cv::Vec3b>(i,j)[0];
    }
}

但这不起作用,所以我现在不知所措我不知道如何成功地image_data用所有三个通道的值填充数组,而不改变代码结构,因为这个数组随后用于我的图像处理算法。

4

3 回答 3

3

我不明白你到底想做什么。您可以使用以下命令直接读取彩色图像:

cv::Mat img = cv::imread("image.jpeg",1);

您的矩阵 ( img) 类型将是 CV_8UC3,然后您可以像您所说的那样访问每个像素:

img.at<cv::Vec3b>(row,col)[channel].

如果你有一个 as 的二维数组,Vec3bVec3b myArray[n][m]; 可以像这样访问这些值:

myArray[i][j](k)其中 k={1,2,3} 因为 Vec3b 是行矩阵。

于 2012-06-12T08:47:09.167 回答
2

这是我刚刚测试的代码,它可以工作。

#include <iostream>
#include <cstdlib>
#include <opencv/cv.h>
#include <opencv/highgui.h>

int main(int argc, char**argv){

  cv::Mat img = cv::imread("image.jpg",1);
  cv::imshow("image",img);
  cv::waitKey(0);
  cv::Vec3b firstline[img.cols];
  for(int i=0;i<img.cols;i++){
    // access to matrix
    cv::Vec3b tmp = img.at<cv::Vec3b>(0,i);
    std::cout << (int)tmp(0) << " " << (int)tmp(1) << " " << (int)tmp(2) << std::endl;
    // access to my array
    firstline[i] = tmp;
    std::cout << (int)firstline[i](0) << " " << (int)firstline[i](0) << " " << (int)firstline[i](0) << std::endl;
  }
  return EXIT_SUCCESS;
}
于 2012-06-12T14:25:33.907 回答
0

在您编辑的第一条消息中,这一行很奇怪:

image_data[0][i*width+j]=all_images[nb_image-1].at<cv::Vec3b>(i,j)[2];

如果图像数据是你的彩色图像,那么它应该这样写:

image_data[i][j] = all_images[nb_image-1].at<cv::Vec3b>(i,j);
于 2012-06-12T18:06:21.960 回答