在 OpenCV4Android 中访问和修改 Mat 的各个元素的标准方法是什么?另外,BGR(我认为这是默认的)和灰度的数据格式是什么?
编辑:让我们更具体一点。mat.get(row, col) 返回一个双精度数组。这个数组中有什么?
3 回答
如果您只想访问一些像素,请使用double[] get(int row, int col)并使用put(int row, int col, double... data) 写入。如果您正在考虑访问整个图像或在循环中迭代图像的数据,那么您应该做的最好的事情是将 Mat 数据复制到 Java 原始数据类型中。完成数据操作后,只需将数据复制回 Mat 结构即可。
图像使用CV_8U,如果您有灰度图像,它将使用CV_8UC1如果您有 RGB 图像,它将使用 CV_8UC3 的 Mat(CV_8U的3 个通道)。CV_8U相当于java中的字节。:)
我可以给你和我在 Java(Android 平台)中使用的方法来二值化灰度图像的示例:
private Mat featuresVectorBinarization(Mat fv){
int size = (int) fv.total() * fv.channels();
double[] buff = new double[size];
fv.get(0, 0, buff);
for(int i = 0; i < size; i++)
{
buff[i] = (buff[i] >= 0) ? 1 : 0;
}
Mat bv = new Mat(fv.size(), CvType.CV_8U);
bv.put(0, 0, buff);
return bv;
}
希望有帮助。
在 OpenCV4Android 中访问和修改 Mat 的各个元素的标准方法是什么?
AMat
是我们在数学中称为“矩阵”的东西 - 由行和列设置的矩形数组。在图像 Mat 的情况下,这些“数量”表示像素(例如,矩阵的每个元素都可以是图像 Mat 中每个像素的颜色)。从本教程:
在上图中,您可以看到汽车的镜子只不过是一个包含所有像素点强度值的矩阵。
那么你将如何遍历一个矩阵呢?这个怎么样:
for (int row=0; row<mat.rows(); row++) {
for (int col=0; col<mat.cols(); col++ ) {
//...do what you want..
//e.g. get the value of the 3rd element of 2nd row
//by mat.get(2,3);
}
}
在 OpenCV4Android 中访问和修改 Mat 的各个元素的标准方法是什么?
您可以Mat
使用其函数获取元素的值get(x)(y)
,其中x
是元素的第一个坐标(行号)和y
第二个坐标(列号)。例如,要获取名为的BGR
图像第 7 行的第 4 个元素,请使用 的方法获取类型为 的数组,该数组的大小为,每个数组元素代表图像格式的、和通道中的每一个。Mat
bgrImageMat
get
Mat
double
3
Blue
Green
Red
BGR
double [] bgrColor = bgrImageMat.get();
另外,BGR(我认为这是默认的)和灰度的数据格式是什么?编辑:让我们更具体一点。mat.get(row, col) 返回一个双精度数组。这个数组中有什么?
您可以从网上阅读有关 BGR 颜色格式和灰度的信息。例如BGR和灰度。
简而言之,BGR 颜色格式有 3 个通道:Blue
,Green
和Red
. 所以当是一个图像时,double
返回的数组是一个大小为 3 的数组,它的每个元素分别包含每个,和通道的值。mat.get(row, col)
mat
BGR
Blue
green
red
同样,灰度格式是 1 通道颜色格式,因此double
返回的大小为 1。
我从学习 OpenCV Mat 对象中可以理解的是,Mat 是可以表示任何 W x H 像素图像的对象。
现在假设您要访问图像的中心像素
X = W/2 Y = H/2
然后您可以按如下方式访问像素数据 double[] data = matObject.get(x,y);
现在数据代表什么以及数据数组的大小是多少。这取决于图像类型。如果图像是灰度图像,则 data.length = 1 ,因为只有一个通道,并且 data[0] 表示该像素的颜色值,即。0(黑色)- 255(白色)
如果图像是彩色图像,则 data.length = 4(rgba) ,因为有四个通道,并且 data[0-n] 表示该像素的颜色值