c – 如何填充Vec3b数组

我在使用OpenCV处理C中的图像.

我用二维的uchar数组编写代码,我可以读取图像的像素值,使用.at<以灰度级上传imread. UCHAR>(I,J). 但是我想对彩色图像做同样的事情.因为我知道要访问像素值,我现在需要.at< Vec3b>(i,j)[0] ,. at< Vec3b>(i,j)[1]和.at< Vec3b>(i,j)[2],我制作了类似的Vec3b 2d阵列.

但我不知道如何用像素值填充此数组.它必须是2D阵列.

我试过了:

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数组,而不改变代码结构,因为这个数组随后用于我的图像处理算法.

最佳答案
这是我刚刚测试的代码,它的工作原理.

#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;
}

转载注明原文:c – 如何填充Vec3b数组 - 代码日志