2017-11-09 6 views
0

内のfloatデータ型と強度範囲でRGBチャンネルがどのように私は0-255 内OpenCVの - 0-255

  • FLOATデータ型
  • 強度範囲として、RGBチャンネルの値を達成することができます

    Daltonizationを実装するために浮動小数点数学演算を実行するので、私はCV_32FC4を行列型として使用しました。私は、輝度範囲がCV_8UC3のRGBチャンネルの輝度範囲と同じであることを期待していました。ちょうど異なるデータタイプを持っていました。しかし、私がマトリックスを印刷したとき、私はチャンネルの強度が0〜255の範囲内にないことに気づいた。浮動小数点の範囲のためにそれが実現したmatrix type

    Mat mFrame(height, width, CV_32FC4, (unsigned char *)pNV21FrameData); 
    
    for(int y = 0 ; y < height ; y++){ 
        for(int x = 0 ; x < width ; x++){ 
         Vec4f BGRA = mFrame.at<Vec4f>(y,x); 
         // Algorithm Implementation 
    
         mFrame.at<Vec4f>(y,x) = BGRA; 
        } 
    } 
    
    Mat mResult; 
    mFrame.convertTo(mResult, CV_8UC4, 1.0/255.0); 
    

    BGRA[0] = BGRA[0] * n;のようなピクセルを操作して、それをマトリックスに戻す必要があります。

+0

float行列 'mFrame'の範囲は何ですか? – Miki

+0

フロート行列を印刷したとき、私は2.3693558e-38 – Moon

+0

のような値を得ました。あなたの 'pNV21FrameData'はどこから来たのですか?すでにfloatですか?または、他の何か? 0-255の浮動小数点数のデータを持つことができます。そして、1.0/255.0を実行する必要はありません。これは、0〜1の範囲にある場合にのみ必要です。 – api55

答えて

1

あなたのコメントとそのリンクによって、データがBGRAに入っていることがわかります。データはucharにあります。

私はこのラインからこれを前提としています。これはあなたが行列を作成し、それをfloat型に変換することができます解決するために

Mat mResult(height, width, CV_8UC4, (unsigned char *)poutPixels); 

Mat mFrame(height, width, CV_8UC4, (unsigned char *)pNV21FrameData); 
Mat mFloatFrame; 
mFrame.convertTo(mFloatFrame, CV_32FC4); 

スケーリングファクタを置くことができる別のもの(0-1など)が必要な場合は、現在の範囲(0-255)を保持することに注意してください。

最後に変換することはできますが、この機能はsaturate_castになります。オーバーフローまたは小数点を管理する特定の方法がある場合は、変換する前にそれを行う必要があります。

Mat mResult; 
mFloatFrame.convertTo(mResult, CV_8UC4); 

データ(少なくとも操作前)0〜255の範囲内に既にあるので1.0/255.0が、そこではないことに注意してください。

あなたのコメントのリンクは、IplImageや他の古いC(廃止予定)バージョンのOpenCvを使用しています。 C++で作業している場合は、MatのようなC++バージョンに固執してください。これはここに表示されているコードではなく、リンク先のコードにあります。このコメントは、今後の頭痛を避けるためのものです。

+0

私はそれをどのように変換するのですか?saturate_castはどのように機能しますか?値は整数に見積もられますか? – Moon

+1

ドキュメントを引用しています: "パラメータが浮動小数点値で、対象の型が整数(8,16または32ビット)の場合、浮動小数点値は最初に最も近い整数に丸められ、必要(ターゲットタイプが8ビットまたは16ビットの場合)。必要に応じて丸められ、クリップされる(例えば、-1.3123 = 0,256.54 = 255,125.9 = 126,18。0 = 18) – api55

+0

アップ&私の質問を楽しませる人々に感謝の気持ちを表明するのに十分ではありません。これにはフラグを立てる必要がありますが、ありがとうございます! – Moon