将OpenCV vector< std::vector<Point > > contours
从JNI C++函数传递到Android中的Java的最佳方式是什么?我目前的做法是使用双打数组,但效率很低。有没有办法使用指针?将OpenCV轮廓从JNI C++函数传递到Java中的Android
0
A
回答
1
下面是从JavaCPP Presets for OpenCV包装访问轮廓的有效途径:
import org.bytedeco.javacpp.indexer.*;
import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
import static org.bytedeco.javacpp.opencv_highgui.*;
public class Contours {
public static void main(String[] args) {
Mat grayscaleImage = imread("lena.png", CV_LOAD_IMAGE_GRAYSCALE);
Mat binarizedImage = new Mat();
MatVector contours = new MatVector();
threshold(grayscaleImage, binarizedImage, 128, 255, THRESH_BINARY);
findContours(binarizedImage, contours, RETR_LIST, CHAIN_APPROX_NONE);
int contoursSize = (int)contours.size();
System.out.println("size = " + contoursSize);
for (int contourIdx = 0; contourIdx < contoursSize; contourIdx++) {
// compute center
float x = 0, y = 0;
Mat contour = contours.get(contourIdx);
IntIndexer points = contour.createIndexer(false);
int pointsSize = contour.rows();
for (int pointIdx = 0; pointIdx < pointsSize; pointIdx++) {
x += points.get(pointIdx, 0);
y += points.get(pointIdx, 1);
}
System.out.println("center = (" + x/pointsSize + ", " + y/pointsSize + ")");
}
}
}
为简单起见,我使用的Java SE,但我们可以做Android上的同样的事情。
2
那么,你可以在Java端创建一个类,相当于C++端的vector< std::vector<Point > >
。然后,在C++中编写一个序列化器函数,并在Java中编写解除器方法。
你的串行器可以是它们由,
和;
分隔双重价值,它可以easliy在Java中反序列化的组成String
。
以这种方式,不是发送多个数组,而是只能发送一个字符串。在将其转换为double并将其转换回来时,您需要小心double的精度。
相关问题
- 1. OpenCV的(C):计算时刻从轮廓
- 2. OpenCV Java极限轮廓
- 3. JNI:从C++传递字节到java
- 4. OpenCV轮廓?
- 5. 如何将C++函数指针传递到库的JNI函数
- 6. Opencv轮廓
- 7. OpenCV轮廓方向
- 8. OpenCV分割轮廓
- 9. OpenCV从Canny边缘到轮廓
- 10. OpenCV中的轮廓阵列
- 11. OpenCV轮廓时刻?
- 12. Android JNI:将std :: string传递给Java并返回到C++
- 13. 在Android中使用opencv绘制轮廓
- 14. OpenCV:从轮廓树转换为轮廓 - cvContourFromContourTree()
- 15. JNI将树形图从java传递到c
- 16. 如何通过JNI将大型结构从C传递到JAVA
- 17. 将ANSI字符串从Java传递到C++(JNI)
- 18. OpenCV ||轮廓相似性
- 19. 在opencv中填充轮廓
- 20. 在OpenCV中使用轮廓?
- 21. 查找从轮廓到点的距离opencv C++
- 22. C++ OpenCV消除较小的轮廓
- 23. findContours在opencv中找不到轮廓
- 24. 从C++中的斑点检测中提取OpenCV轮廓阵列
- 25. 传递字符串数组从Java到C与JNI
- 26. 订购OpenCV的轮廓
- 27. OpenCV的轮廓去除
- 28. OpenCV的轮廓和层次
- 29. 将ByteArray从Python传递到C函数
- 30. 将XML从XSLT传递到C#函数
java中没有指针。你可以将一个指针值存储到java中,但这只能帮助保持参考。 – Fildor 2014-12-02 06:14:06
也许这个答案可以帮助你http://stackoverflow.com/a/23116736/2455351(这是为传递一个矢量) –
migue02
2014-12-02 07:51:20
FYI,我们可以直接使用[JavaCPP](https:// github。 com/bytedeco/javacpp /):http://bytedeco.org/javacpp-presets/opencv/apidocs/org/bytedeco/javacpp/class-use/opencv_core.PointVectorVector.html – 2014-12-06 08:13:59