将OpenCV代码从C ++转换为Java
我目前正在尝试将一些遗留代码从iPhone迁移到Android。 此代码使用OpenCV库进行一些图像处理。 总的来说它很顺利,但我坚持使用一行代码,我不知道如何将其转换为Java代码:
Scalar dMean; Scalar scalar; std::vector channels; split(mat, channels); for(int i=0; i<3; ++i) { channels[i] += dMean[i]; }
问题是 – 在Java代码中应该使用什么代替+ =运算符来将Scalar对象添加到Mat?
注意:拿一下这个答案,我还没有完全测试过这个;)
选项1:
最直接的方法是,如果你只处理一些像素,则使用your_mat.put(row,col,data)和your_mat.get(row,col) 。
因为put()
方法不接受Scalar
对象作为数据参数,所以必须将Scalar
转换为put()
接受的内容。
因此,如果你的Scalar
是(1,2,3),则可能是int数组int []标量= {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调用,而前者每次调用/获取一次。
相应的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 scalarList = ... // your conversion from a Scalar to a List List channelsList = new ArrayList (); 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转换类似。
- MVP到MVVM Android
- 如何正确使用向后兼容的Vector Drawable与最新的Android支持库?
- 如何在listview文件浏览器中删除条目和video文件?
- 如何使用JSch运行和显示shell命令ssh的结果?
- 我已将Android API更新为23并且任何xml文件都没有错误但是当我尝试构建项目时,这显示R无法解析
- Android:如果我将serialVersionUID添加到旧的可序列化对象会发生什么?
- 如何通过拖放将图像保留在布局中
- Android Studio:使用Mongo Java Driver连接到MongoDB服务器
- MediaPlayer isPlaying()总是返回false