将OpenCV vector< std::vector<Point > > contours
从JNI C ++函数传递到Android中的Java的最佳方法是什么?我目前的方法是使用双精度数组,但这是非常低效的。有没有办法使用指针?
答案 0 :(得分:2)
好吧,你可以在Java端创建一个等同于C ++端vector< std::vector<Point > >
的类。然后,用C ++编写一个序列化函数,用Java编写deserailizer方法。
您的序列化程序可以是由String
和,
分隔的双值组成的;
,可以在Java中轻松反序列化。
通过这种方式,您可以只发送一个字符串,而不是发送多个数组。在将其转换为double并将其转换回来时,您需要注意double的精度。
答案 1 :(得分: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上做同样的事情。