注:塩の粒で、この答えを取る、私は完全にこれをテストしていません。)
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と非常によく似ています。
あなたは何を持っているのか、正確に(Javaの場合)どこにいるのでしょうか? – MByD
+ =は、プリミティブでは受け入れ可能な演算子ですが、オブジェクトでは受け入れられません。おそらく、オブジェクトの追加を行うメソッドを記述する必要があります。 – Kylar
C++コードは、Matオブジェクトにスカラを追加します。 Javaでは、ScalarオブジェクトとMatオブジェクトの両方を作成しましたが、スカラをMatに追加するメソッドは見つかりませんでした。JavaCVのCoreクラスには静的なmetod add(Mat、Mat、Mat)が含まれていますが、2つのMatを追加することしかできません。 – Anton