当前位置: 首页 > 面试题库 >

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

赵智
2023-03-14
问题内容

我是使用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()强制转换?请帮忙。

谢谢!


问题答案:

这是由于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);

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



 类似资料:
  • 在一个采访问题中,我被要求解释一种情况,即使用并发哈希图与使用哈希图相比是正确的方法。在板上有两列t1和t2(对应于thread1和thread2),我应该编写一系列操作(如,等)使用concurrenthashmap与hashmap将产生预期结果。 我试图用迭代器举一个例子,但这不是面试官想要的。他在为线程1和线程2寻找一系列的放和拿操作。他说假设我们从不迭代,我们只有放和拿操作。 我查看了SO

  • 虽然调整尺寸,裁剪和变形可用来创建有趣的图像效果,但画布还有另一个更强大的特性:像素处理。通过访问2D渲染上下文的各个像素,我们就能够得到每一个像素的颜色和阿尔法值等信息。我们还能够修改每一个像素的颜色,使之显示出截然不同的效果。 在画布中访问像素的方法是getImageData。这个方法有4个参数:要访问的像素区域原点坐标(x,y)、像素区域的宽度和高度(参见图1)。它可以用代码表示为: con

  • 本文向大家介绍有关Ajax中get和post的使用问题,包括了有关Ajax中get和post的使用问题的使用技巧和注意事项,需要的朋友参考一下 使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化; 解决方法:在?后面链接一个num=【随机数Math.random()】或者num=【时间戳new Date().get

  • 创建资源“/flowers”和GET方法 获取->方法请求->URL查询字符串参数->添加了“颜色” 获取->集成请求->类型:Lambda函数 获取->集成请求->URL查询字符串参数->添加的, 我试图访问lambda处理程序中的参数,但事件总是空的,我不知道参数应该在哪里 我想我不能使用主体映射tamplate,除非我没有使用get的请求主体。

  • 我对Java服务器端编程还不熟悉,我的问题基本上是使用Servlets(低级别,不使用spring mvc等)开始一个起点,然后从node开始构建。js后台,其中路由定义将以函数(,等),函数将在http方法之一(GET、post、PUT、DELETE)的参数中接收和。 如果有人可以帮助我,从一个servlet类中的路由(比如说)开始定义方法,这个servlet类映射到http方法,同时在其参数中

  • 问题内容: 因此,我一直在浏览有关创建REST API的文章。其中一些建议使用所有类型的HTTP请求:like 。我们将创建例如 index.php 并以这种方式编写API: 好的,理所当然-我对Web服务还不太了解。但是,通过常规或(包含方法名称和所有参数)接受 JSON 对象,然后也以JSON进行响应,会不会更容易。我们可以轻松地通过PHP进行序列化/反序列化,并且无需处理不同的HTTP请求方