5

私は現在、いくつかのOpenCVコードをC++からJavaに変換しています。JNAではなくネイティブJavaでの変換が必要なため、JavaCVを使用できません。コードのある時点で、次の割り当てを取得します。

dst[x] = (uchar)(-(kHit >= kForeground));

はどこにdstありuchar*、はsです。kHitkForegroundint

私はこれがどのように機能するかについて何も見つけることができず、Javaはそれを操作として認識しません。コード内の別のポイントでこれらの2つの変数に対する操作があり、255または0の2つの値のいずれかを格納します。

問題のコードはから来ていopencv/video/src/bgfg_gaussmix.cppます。

4

4 に答える 4

7

C++ では、ブール式は 2 つの値0またはのいずれかを生成します1-結果に単項マイナスを適用すると、0またはが得られます-1-1として再解釈するとuchar、 が得られます255

この式は、条件付きで Java に変換できます。

dst[x] = (kHit >= kForeground) ? 255 : 0;

分岐のため、元のものほど速くはなりません。ただし、Java にはブール値を数値として再解釈する機能がないため、その速度についてできることはほとんどありません。

于 2012-07-18T14:47:16.253 に答える
6

kHit >= kForegroundtrueは または のいずれかを返しますfalse。これは、C++ では1またはを意味し0ます。前のマイナスは、これを-1orに変換し0ます。uchar( )へのキャストは for を(uchar)返し、負の for00ラップします。255-1

Konrad のコメントに続いて、私はこれが明確に定義されているかどうかについても懐疑的です。明確に定義されていますが、読みやすさという点では依然としてひどいコードです。:)

于 2012-07-18T14:47:06.213 に答える
1

基本的には次のとおりです。

kHit >= kForeground

ブール型の表現です

-(kHit >= kForeground)

このブール値を(とに基づいて)intに変換しtrue==1false==0それを否定します。その結果、true==-1とになりfalse==0ます。

次に、これはに変換され、uchar結果として-1==255とになり0==0ます。

数値の基本的な実装の詳細を使用しているように見えますが、負の符号なし数値は2の補数に従って動作するように指定されているため、これらの変換はすべてC++およびC標準によって保証されていることに注意してください。

ただし、Javaがこれをサポートしていない場合は、いつでも条件付き割り当てに置き換えることができます。

dst[x] = (kHit>=kForeground) ? 255 : 0;
于 2012-07-18T14:53:21.677 に答える
1

この式は、または(kHit >= kForeground)値を持つブール値を生成します。単項が適用されると、は に昇格し、変換はforまたはfor になります。昇格後、記号はorに変更され、外部キャストによって変換されます。truefalse-boolint1true0false-10uchar

重要な情報は、単項operator-がブール値に適用されるのではなく、ブール値が変換されてからint適用されるということです。これは、ちょっとしたテンプレート マジックでテストできます。

template <typename T, typename U>
struct same_type {
    static const bool value = false;
};
template <typename T>
struct same_type<T,T> {
    static const bool value = true;
};
template <typename T>
void f( T value ) {
    std::cout << "Is int? " << std::boolalpha << same_type<T, int>::value << "\n";
    std::cout << "Is bool? " << same_type<T, bool>::value << "\n";
}
int main() {
    f(-true);
}

fテンプレートは、渡された引数の型を、上記のテンプレートに対して、およびそれらを使用してテストします(int理解boolするのsame_typeは簡単です)。fテンプレートを引数として呼び出すと、-true型推論はT式の型に設定されます-true。プログラムを実行すると、出力されることがわかりますIs int? true\nIs bool? false

于 2012-07-18T15:25:28.107 に答える