将OpenCV代码从C++转换为Java
我正在尝试将一些遗留代码从iPhone迁移到Android。此代码使用OpenCV库进行一些图像处理。总体进展顺利,但我被困在一个代码行我不知道如何可以转换成Java代码:将OpenCV代码从C++转换为Java
Scalar dMean;
Scalar scalar;
std::vector<Mat> channels;
split(mat, channels);
for(int i=0; i<3; ++i) {
channels[i] += dMean[i];
}
的问题是 - 应该用什么来代替Java中的+ =运算符将一个Scalar对象添加到Mat的代码?
注:借此答案与盐粮,我还没有完全测试此;)
OPTION1:
最直接的办法,如果你只打算处理几个像素,通过使用your_mat.put(行,列,数据)和your_mat.get(行,列)。
因为put()
方法不接受Scalar
对象作为数据参数,您必须将Scalar
转换的东西,put()
接受。如果你的Scalar
是(1,2,3)也许是一个int数组int []标量= {1,2,3};如果你的Scalar
是(1,2,3)也许是一个int数组。应该做的伎俩。
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基本数组类型取决于垫类型:
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
OPTION 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的的公司内部,选项2转换类似Converters
工作。
虽然这个答案不再相关,但我会接受它,因为它似乎是正确和完整的 – Anton 2012-06-06 13:14:10
是的,我后来发现问题有点老了。但是,对于新的opencv用户来说,这个问题现在仍然很常见。 AFAIK这些选项是目前迭代Java中像素的最佳选择。 – 2012-06-07 18:47:59
你能告诉我们你有什么,在哪里(在Java中)你卡住了吗? – MByD 2011-12-26 14:00:27
+ =是基元的可接受运算符,但不适用于对象。您可能必须编写一个方法来为对象添加附加内容。 – Kylar 2011-12-26 14:01:57
C++代码将一个标量添加到Mat对象。在Java中,我创建了Scalar和Mat对象,但找不到将Scalar添加到Mat的方法。JavaCV中的Core类包含一个静态metod add(Mat,Mat,Mat),但它只允许添加两个Mat's – Anton 2011-12-26 14:05:32