将OpenCV代码从c++转换为Java
Converting OpenCV code from C++ to Java
我目前正在尝试将一些遗留代码从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?
注意:对这个答案持保留态度,我还没有完全测试过;)
OPTION1:
最直接的方法,如果你只打算处理几个像素,是通过使用your_mat。put(row, col, data) and your_mat。(行,坳)。由于put()
方法不接受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);
OPTION2:
但是,对于大量的像素处理,推荐的方法是首先将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转换。
相关文章:
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- 我需要帮助将我的代码从 c++ 转换为 java
- 将C++映射转换为 Java 映射
- 使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
- C++ (U256)*(H256 const*)(char*[] + int) 将重写转换为 Java
- JNA 将 HICON 转换为 Java Image
- 从c++到java的矢量转换
- 如何将通过TCP发送数据的数据从C++转换为Java
- 如何将 Java double[][] 转换为 C++ <vector<vector>> JNI?
- 如何通过 JNI 将 java CharSequence 转换为 c++ char*
- 将 Java LinkedHashMap 转换为 C++ std::map
- 将本机C 代码转换为Java
- 在使用 JNI 将 c++ unordered_map转换为 java hashMap之前将其转换为 java hash
- 将 C++ 中的字符值转换为具有与 Java 中相同值的字符串
- 如何将 GLCM 的实现转换为 Java C++
- 将 C++ 中的结构转换为 Java 中的类
- 将 Java ArrayList 转换为 C++ 向量时出现问题
- FlatBuffers C++从缓冲区转换为对象,仅适用于root_type(而Java具有所有)
- 将 JNI -> jobject(基本上是 java 文件中的映射和/或映射的映射)转换为 std::map(c++)
- 使用正确的数据类型转换java中的c++方法逻辑