使用get()和put()访问OpenCV for Java中的像素值
computer-vision
image-processing
java
opencv
4
0

我是使用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个通道)并将其减半。运行后我没有任何错误。但是,我得到的输出图像在这两种情况下是不同的。有人可以解释什么问题吗?可能我不完全了解get()函数的工作原理吗?是因为byte()强制转换?请帮忙。

谢谢!

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

这是由于byte()强制转换而发生的。我在第二种情况下将mat image的数据类型更改为* 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);

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号