將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