如何填充 Vec3b 数组
How to fill an array of Vec3b
我正在使用OpenCV处理C++中的图像。
我用二维的 uchar 数组编写了代码,我可以在其中读取图像的像素值,并使用 .at< 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
数组,而不改变代码结构,因为这个数组然后用于我的图像处理算法。
我不明白你想做什么。您可以使用以下方法直接读取彩色图像:
cv::Mat img = cv::imread("image.jpeg",1);
您的矩阵(img
)类型将被CV_8UC3,然后您可以像您所说的那样访问每个像素:
img.at<cv::Vec3b>(row,col)[channel]
.
如果您有 2D Vec3b
数组作为Vec3b myArray[n][m];
您可以访问如下值:
myArray[i][j](k)
其中 k={1,2,3},因为 Vec3b 是一个行矩阵。
这是我刚刚测试的代码,它可以工作。
#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;
}
在您编辑的第一条消息中,这一行很奇怪:
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);
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '