将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的代码?

+0

你能告诉我们你有什么,在哪里(在Java中)你卡住了吗? – MByD 2011-12-26 14:00:27

+0

+ =是基元的可接受运算符,但不适用于对象。您可能必须编写一个方法来为对象添加附加内容。 – Kylar 2011-12-26 14:01:57

+0

C++代码将一个标量添加到Mat对象。在Java中,我创建了Scalar和Mat对象,但找不到将Scalar添加到Mat的方法。JavaCV中的Core类包含一个静态metod add(Mat,Mat,Mat),但它只允许添加两个Mat's – Anton 2011-12-26 14:05:32

注:借此答案与盐粮,我还没有完全测试此;)

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工作。

+0

虽然这个答案不再相关,但我会接受它,因为它似乎是正确和完整的 – Anton 2012-06-06 13:14:10

+1

是的,我后来发现问题有点老了。但是,对于新的opencv用户来说,这个问题现在仍然很常见。 AFAIK这些选项是目前迭代Java中像素的最佳选择。 – 2012-06-07 18:47:59