在OpenCV4Android中访问和修改Mat的各个元素的标准方法是什么?另外,BGR的数据格式(我认为是默认值)和灰度等级是什么? 编辑:让我们更具体一点。 mat.get(row,col)返回一个double数组。这个数组是什么?
答案 0 :(得分:12)
如果你只是想访问一些像素,可以使用 double [] get(int row,int col)并使用 put(int row,int col,double ..数据)。如果您正在考虑访问整个图像或在循环中迭代图像的数据,那么您应该做的最好的事情是将Mat数据复制到Java原始数据类型中。完成数据操作后,只需将数据复制回Mat结构。
图像使用 CV_8U ,如果您有灰度图像,它将使用 CV_8UC1 如果您有RGB图像,它将使用 CV_8UC3 (3个CV_8U通道)。 CV_8U 相当于java中的byte。 :)
我可以举例说明我在Java(Android平台)中使用的方法 binarize 灰度图像:
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;
}
希望有所帮助。
答案 1 :(得分:10)
在OpenCV4Android中访问和修改Mat的各个元素的标准方法是什么?
我们称之为Mat
&#34;矩阵&#34;在数学中 - 由行和列设置的矩形数组。那些&#34;数量&#34;在图像Mat的情况下表示像素(例如,矩阵的每个元素可以是图像Mat中的每个像素的颜色)。来自this教程:
在上面的图片中你可以看到汽车的镜子什么都没有 不仅仅是包含像素的所有强度值的矩阵 分。
那你怎么去迭代矩阵呢?怎么样:
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
的{{1}}图像Mat
的第7行的第4个元素,请使用bgrImageMat
的{{1}}方法获取数组键入get
,其大小为Mat
,每个数组元素代表{{1}的double
,3
和Blue
个通道图像格式。
Green
另外,BGR的数据格式(我认为是默认值)和灰度等级是什么?编辑:让我们更具体一点。 mat.get(row,col)返回一个double数组。这个数组是什么?
您可以从网上了解BGR颜色格式和灰度。例如BGR和Grayscale。
简而言之,BGR颜色格式有3个频道:Red
,BGR
和double [] bgrColor = bgrImageMat.get();
。因此,当Blue
是Green
图像时,Red
返回的double
数组是一个大小为3的数组,其每个元素都包含每个元素的值分别为mat.get(row, col)
,mat
和BGR
个频道。
同样,灰度格式是1通道颜色格式,因此返回的Blue
的大小为1。
答案 2 :(得分:0)
通过了解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),因为有四个通道,而数据[0-n]表示该像素的颜色值