opencv怎么将图像数据存入矩阵

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv怎么将图像数据存入矩阵相关的知识,希望对你有一定的参考价值。

如题,之前我是将每幅图用cvGet2D得到的像素值依次赋值到数组里。因为事先不知道图片大小,所以用动态数组也就是new的方法。但这次可能是要处理的图片较大较多的原因,程序运行后在动态数组这报错,查了下,好像是野指针什么的原因,不知道该怎么解决。
于是我考虑用opencv里的Mat,现在的问题是,读取的图片是unit8的,但我后续的需要将其以float或double来计算,否则结果肯定会溢出。请问有什么类似matlab里im2double的方法么?
或者还有什么更好的办法得到图片相应的像素值矩阵?

我也不是很熟,但是Mat存图像也用过,试着说一下我的理解:
一般的图像文件格式使用的是 Unsigned 8bits吧,CvMat矩阵对应的参数类型就是
CV_8UC1,CV_8UC2,CV_8UC3。
(最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3)

而float 是32位的,对应CvMat数据结构参数就是:CV_32FC1,CV_32FC2,CV_32FC3...
double是64bits,对应CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3等。

变换这种矩阵单位类型,Mat里有一个函数convertTo可以办到:
C++:void Mat::convertTo(OutputArray m, int rtype, double alpha=1, double beta=0 )
rtype 参数就是上述单位类型。具体可以查相关的文档。

手打,希望可以帮到你。
参考技术A 使用Mat类的convertTo就可以了啊。

如何用opencv提取一张图片的像素矩阵

操作单个像素方法:
at(int y, int x)
cv::mat的成员函数: at(int y, int x)可以用来存取图像中对应坐标为(x,y)的元素坐标。但是在使用它时要注意,在编译期必须要已知图像的数据类型,这是因为cv::mat可以存放任意数据类型的元素。因此at方法的实现是用模板函数来实现的。
使用方法:假设提前已知一幅图像img的数据类型为 unsigned char型灰度图(单通道),要对坐标为(10,12)的像素重新赋值为128,则对应操作如下
img.at<uchar>(12,10) = 128;
参考技术A 矩阵是像素的集合,通道是指每个像素用几种基色(不知道这样描述准不准确)组成,一般由RGB组成,有的带有a(alpha)。可以用cvSplit函数将3/4通道的图像的追问

然后呢?

参考技术B 从imageData中取,BGR顺序存的,每WidthStep换行本回答被提问者采纳 参考技术C 矩阵是像素的集合,通道是指每个像素用几种基色(不知道这样描述准不准确)组成,一般由RGB组成,有的带有a(alpha)。可以用cvSplit函数将3/4通道的图像的RGB(假设是RGB颜色空间)分离成只有R的图片、只有G的图片和只有B的图片!

以上是关于opencv怎么将图像数据存入矩阵的主要内容,如果未能解决你的问题,请参考以下文章

用opencv将xml文件(里面存的是100*100的矩阵)读入,并定义一个新的Mat类矩阵,将xml中的矩阵存入其中。

opencv图像旋转,该怎么解决

OpenCV创建矩阵,每行包含多个图像

从 3 通道彩色图像的原始数据加载 Opencv 矩阵

2019-10-01 opencv图像数据结构之Mat

如何用opencv提取一张图片的像素矩阵