java - 将 OpenCV 代码从 C++ 转换为 Java

标签 java android c++ opencv

我目前正在尝试将一些遗留代码从 iPhone 迁移到 Android。此代码使用 OpenCV 库进行一些图像处理。总的来说一切顺利,但我卡在了一行代码上,我不知道如何将其转换为 Java 代码:

Scalar dMean;
Scalar scalar;
std::vector<Mat> channels;
split(mat, channels);
for(int i=0; i<3; ++i) {
   channels[i] += dMean[i];
}

问题是 - 在 Java 代码中应该使用什么来代替 += 运算符来将标量对象添加到 Mat?

最佳答案

注意:对这个答案持保留态度,我还没有完全测试过;)

选项 1:

如果您只处理几个像素,最直接的方法是使用 your_mat.put(row, col, data)your_mat.get(row, col).

因为 put() 方法不接受 Scalar 对象作为数据参数,所以您必须将 Scalar 转换为 Scalar 对象 put() 接受。

因此,如果您的 Scalar 是 (1,2,3) 可能是一个 int 数组 int[] scalar = {1,2,3}; 应该可以解决问题.

int[] scalar = ... // convert from Scalar object

// assuming the result of get() is an int[], sum both arrays:
int[] data = your_mat.get(row, col) + scalar // <- pseudo-code alert :D

your_mat.put(row, col, data);

选项 2:

但是对于大量像素处理,推荐的方法是先将 Mat 转换为 Java 图元,处理图元,然后将其转换回 Mat .这是为了避免过多的 JNI 调用,此方法执行 2 次 JNI 调用,而前者每次 put/get 调用一次。

对应的Java原始数组类型取决于Mat类型:

CV_8U and CV_8S -> byte[];
CV_16U and CV_16S -> short[];
CV_32S -> int[];
CV_32F -> float[];
CV_64F-> double[];

所以代码将是这样的:

// assuming Mat it's of CV_32S type
int buff[] = new int[your_mat.total() * your_mat.channels()];

your_mat.get(0, 0, buff);

// buff is now Mat converted to int[]

your_mat.put(0, 0, buff); // after processing buff, convert it back to Mat type

选项 3:

好吧,这些解决方案非常丑陋,这个不是最有效的,但它以 Java 的方式不那么丑陋:

List<Integer> scalarList = ... // your conversion from a Scalar to a List
List<Integer> channelsList = new ArrayList<Integer>();

Converters.Mat_to_vector_int(channels, channelsList); // this is an existing OpenCV4Android converter

// process channelsList and scalarList, store in channelsList

channels = Converters.vector_int_to_Mat(channelsList); // after processing, convert it back to Mat type

现在我考虑一下选项 3选项 2 非常相似,如果 OpenCV 的Converters 在内部与选项 2 转换。

关于java - 将 OpenCV 代码从 C++ 转换为 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8636403/

相关文章:

java - Akka 如何从 ForkJoinPool 中获益?

java - set集合中添加元素最快的方法

android - 如何扩展HERE map 库?

c++ - 如何确定 Qt 驱动器上有多少可用空间?

c++ - Const 类成员复制构造函数

java - Hibernate HQL NULL 比较模式

java - 使用 exec 通过 PHP 运行 JAR 时避免 JVM 启动延迟

android - 加载 webview 后如何在 android 中启动另一个 Activity ?

android - 从BroadcastReceiver调用后台服务

c++ - 读取各种维度的txt文件作为k-means算法程序的输入