gar*_*gsl 10 java android opencv image-processing computer-vision
我是使用OpenCV for JAVA的初学者.我想访问图像矩阵的各个像素值.因为,用于OpenCV的JAVA jar不提供像C++这样的好功能,我遇到了一些麻烦.经过大量的搜索,我发现了两种不同的方法,虽然没有正确解释(甚至在文档中都没有).我们可以使用get()和put()函数或者将mat数据转换为原始java类型(如数组).我试过两个但得到不同的输出结果!请帮助解释我做错了什么.我使用它们是错误还是其他一些愚蠢的问题.我仍然是新手,所以请原谅,如果这是一个愚蠢的问题.:)
情况1:使用get()函数
Mat A = Highgui.imread(image_addr); \\"image_addr" is the address of the image
Mat C = A.clone();
Size sizeA = A.size();
for (int i = 0; i < sizeA.height; i++)
for (int j = 0; j < sizeA.width; j++) {
double[] data = A.get(i, j);
data[0] = data[0] / 2;
data[1] = data[1] / 2;
data[2] = data[2] / 2;
C.put(i, j, data);
}
Run Code Online (Sandbox Code Playgroud)
案例2:使用数组
Mat A = Highgui.imread(image_addr); \\"image_addr" is the address of the image
Mat C = A.clone();
int size = (int) (A.total() * A.channels());
byte[] temp = new byte[size];
A.get(0, 0, temp);
for (int i = 0; i < size; i++)
temp[i] = (byte) (temp[i] / 2);
C.put(0, 0, temp);
Run Code Online (Sandbox Code Playgroud)
根据我的理解,他们都应该做同样的事情.它们都访问各个像素值(所有3个通道)并使其成为一半.运行后我没有收到任何错误.但是,我得到的输出图像在这两种情况下是不同的.有人可以解释一下是什么问题吗?可能我不明白get()函数究竟是如何工作的?是因为byte()转换?请帮忙.
谢谢!
这是因为byte()转换而发生的.我在第二种情况下将mat图像的数据类型更改为*CV_64FC3*,这样我就可以使用double []而不是byte []来解决问题.
Mat A = Highgui.imread(image_addr); //"image_addr" is the address of the image
Mat C = A.clone();
A.convertTo(A, CvType.CV_64FC3); // New line added.
int size = (int) (A.total() * A.channels());
double[] temp = new double[size]; // use double[] instead of byte[]
A.get(0, 0, temp);
for (int i = 0; i < size; i++)
temp[i] = (temp[i] / 2); // no more casting required.
C.put(0, 0, temp);
Run Code Online (Sandbox Code Playgroud)
仅供参考,我也做了一些时间测量,使用第二种方法比第一种方法快.
| 归档时间: |
|
| 查看次数: |
25682 次 |
| 最近记录: |