2011-12-26 28 views
6

私は現在、iPhoneからAndroidに少しのレガシーコードを移行しようとしています。このコードでは、OpenCVライブラリを使用して画像処理を行っています。全体的にはよく行くが、私はJavaコードに変換することができますか見当がつかないコードの1行にこだわっ: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の+ =演算子を使用すべきかマットにスカラーオブジェクトを追加するコード?

+0

あなたは何を持っているのか、正確に(Javaの場合)どこにいるのでしょうか? – MByD

+0

+ =は、プリミティブでは受け入れ可能な演算子ですが、オブジェクトでは受け入れられません。おそらく、オブジェクトの追加を行うメソッドを記述する必要があります。 – Kylar

+0

C++コードは、Matオブジェクトにスカラを追加します。 Javaでは、ScalarオブジェクトとMatオブジェクトの両方を作成しましたが、スカラをMatに追加するメソッドは見つかりませんでした。JavaCVのCoreクラスには静的なmetod add(Mat、Mat、Mat)が含まれていますが、2つのMatを追加することしかできません。 – Anton

答えて

5

注:塩の粒で、この答えを取る、私は完全にこれをテストしていません。)

OPTION1:

最も直接的な方法、そしてあなただけしようとしている場合数ピクセルを処理するには、your_mat.put(row、col、data)your_mat.get(row、col)を使用します。

put()方法は、データパラメータとしてScalarオブジェクトを受け入れていないので、あなたはput()が受け入れるものにScalarを変換する必要があります。

したがって、Scalarが(1,2,3)の場合、int配列int []スカラー= {1,2,3};はこのトリックを行うべきです。

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:

しかし、推奨される方法は、ピクセル処理の多くのために、最初のプリミティブJavaプリミティブ、プロセスにMatを変換しMatに戻って、それを変換することです。これはあまりにも多くのJNI呼び出しを避けるためです。このメソッドは2つのJNI呼び出しを行い、一方、前者はput/getごとに1つの呼び出しを行います。

対応するJavaのプリミティブ配列型は、マットタイプによって異なります。

CV_8U and CV_8S -> byte[]; 
CV_16U and CV_16S -> short[]; 
CV_32S -> int[]; 
CV_32F -> float[]; 
CV_64F-> double[]; 

ので、コードはこのようなものになりますので

OK:

// 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のConverters仕事ならば、オプション2と非常によく似ています。

+0

この回答はもう適切ではありませんが、それは正しいと思われるので、私はそれを受け入れます – Anton

+1

はい、私は後で質問が少し古いことに気付きました。しかし、新しいopencvユーザにとってはまだまだ問題はかなり一般的です。 AFAIKこれらのオプションは現在、javaのピクセルを反復処理するための最良の選択肢です。 –

関連する問題