java - 使用 get() 和 put() 访问 OpenCV for Java 中的像素值

标签 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);
    }

案例 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);

现在根据我的理解,他们都应该做同样的事情。他们都访问单个像素值(所有 3 个 channel )并将其减半。运行后我没有收到任何错误。但是,在这两种情况下,我得到的输出图像是不同的。有人可以解释一下是什么问题吗?可能是我不明白 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);

仅供引用,我也做了一些时间测量,使用第二种方法比第一种方法快得多。

关于java - 使用 get() 和 put() 访问 OpenCV for Java 中的像素值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17035005/

相关文章:

java - 使用 DataBufferByte 处理二进制位图图像中的像素

java - 如何将泛型参数与 Lambda 一起使用

Android Ffmpeg-未授予 "su"工作目录:null的根权限

机器人,改造 : Pressing back button during API call crashes the app

c++ - 从 OpenCV 中的 Matrix 访问值

java - 替代 Java 8 中的 Thread.stop()?

java - 如何使按钮点击功能被多次点击?

android - Facebook 受众 SDK

opencv - 使用opencv查找没有角的矩形

python - OpenCV 的 cv2.boundingRect() 函数如何工作?