2017-04-19 6 views
0

これまでのところ、このコミュニティは私に質問をすることなく私を助けましたが、今日は答えを見つけることができなかったので、私は最初の質問をしなければなりません私はコミュニティの手伝いが切望されています。共有メモリから4バイトpP深度イメージを保存

私は画像を共有メモリに書き込むシミュレーションプログラムを使っています。メモリアドレスにアクセスして、画像を保存します。シミュレーションは2つの画像を送信しています.1つは通常の画像、もう1つは深さ情報です。開いているCVで通常の画像を保存することは問題ありません。

読書と次のように通常の画像が行われている省エネ:

//find image in Memory 
uchar *imageMem = (uchar*)img + sizeof(RDB_IMAGE_t); 

//set heights and width to image parameters 
int w = img->width; 
int h = img->height; 

//create matrix for image 
Mat image(h,w,CV_8UC3,imageMem); 

//image is upside-down in memory, so it has to be flipped 
Mat flipped; 
flip(image,flipped,0); 

//change color from bgr to rgb 
Mat recolored; 
cvtColor(flipped, recolored, COLOR_BGR2RGB); 

string folderName = "normal"; 
string name = "normal_"; 
string type = ".png"; 

ss << folderName << "/" << name << simFrame << type; 

string filename = ss.str(); 
ss.str(""); 
imwrite(filename, recolored); 

今実際の問題に。シミュレーションは深度情報を異なる共有メモリアドレスに保存しますが、常にimgに保存されます。画像のインデックスに応じて、ポインタimgは、対応するメモリアドレスを指しています。通常画像のアドレスは0x0811aであり、奥行き画像0x0811bのアドレスである。次のように奥行き画像を保存するためのコードが見えます:奥行き情報を保存した後

uchar *imageMem = (uchar*)img + sizeof(RDB_IMAGE_t); 

int w = img->width; 
int h = img->height; 

Mat image_d(h,w,CV_8UC4,imageMem); 

Mat flipped; 
flip(image_d,flipped,0); 

Mat recolored; 
cvtColor(flipped, recolored, CV_BGRA2GRAY, 1); 

string folderName = "Depth"; 
string name = "Depth_"; 
string type = ".png"; 

ss << folderName << "/" << name << simFrame << type; 

string filename = ss.str(); 
ss.str(""); 
imwrite(filename, recolored); 

結果は次のようになります。

Depth image while using CV_8UC4 to save the image.

しかし、それは次のようになります。

How the image should look like after saving.

シミュレーションの開発者は、奥行き画像が共有メモリに4 by 1ピクセルあたり1ピクセルの値は常に255です。この情報は私には役立ちませんが、おそらくあなたのことです。

私は画像処理について知っています。私は自分自身を考えていましたが、この時点で私は本当に何をすべきか分かりません。

Image Micka requested

+0

どのタイプがimgですか? sizeof(RDB_IMAGE_t)の値は何ですか; – Micka

+1

あなたはcvtColor行を削除し、画像を.pngとして保存してアップロードできますか? – Micka

+1

タイトルは「4ビット深度」、テキストは「1ピクセルあたり4バイト」と言っています。また、腐敗が起きた時を見つけるために、各ステップの後に共有メモリを調べたりダンプしたりすることはできませんか? – VTT

答えて

0

あなたはその構成チャネルに提供した画像を分割した場合、あなたは物事のカップルを見つけるでしょう。

まず、4つのチャンネルがあります - 実際にはそうではありませんが、R、G、B、Aであるとしましょう。

第2に、最後の2つのチャンネルは同じです - 最小/最大と標準偏差は同じですので、そのうちの1つを破棄できます。

Image: depth.png 
    Format: PNG (Portable Network Graphics) 
    Mime type: image/png 
    Class: DirectClass 
    Geometry: 800x600+0+0 
    Units: Undefined 
    Type: TrueColorAlpha 
    Endianess: Undefined 
    Colorspace: sRGB 
    Depth: 8-bit 
    Channel depth: 
    Red: 8-bit 
    Green: 8-bit 
    Blue: 8-bit 
    Alpha: 8-bit 
    Channel statistics: 
    Pixels: 480000 
    Red: 
     min: 0 (0) 
     max: 255 (1) 
     mean: 181.668 (0.712422) 
     standard deviation: 82.4882 (0.323483) 
     kurtosis: -0.888916 
     skewness: -0.74329 
     entropy: 0.734481 
    Green: 
     min: 0 (0) 
     max: 255 (1) 
     mean: 175.737 (0.689165) 
     standard deviation: 84.9054 (0.332963) 
     kurtosis: -1.09314 
     skewness: -0.611227 
     entropy: 0.741165 
    Blue: 
     min: 229 (0.898039)      <--- HERE 
     max: 255 (1)        <--- HERE 
     mean: 252.276 (0.989316)     <--- HERE 
     standard deviation: 5.81622 (0.0228087) <--- HERE 
     kurtosis: 7.14093 
     skewness: -2.88764 
     entropy: 0.595817 
    Alpha: 
     min: 229 (0.898039)      <--- HERE 
     max: 255 (1)        <--- HERE 
     mean: 252.276 (0.989316)     <--- HERE 
     standard deviation: 5.81622 (0.0228087) <--- HERE 
     kurtosis: 7.14093 
     skewness: -2.88764 
     entropy: 0.595817 

あなたはその後、4つのチャンネルを抽出する場合は、この(Rまず、その後、G、そしてB)を取得します:

enter image description here enter image description here enter image description here

を、私は最後の画像のようにだと思います(Bチャンネル)はちょうど4~5のバンドを持ち、次第に明るくなります。これはおそらく上位バイトです。最初の画像(Rチャンネル)はバンドで結ばれているので、Bチャンネルの大きなステップの中間の滑らかな勾配であると思うので、それは中間のバイトです。第2の画像は最も荒々しく変化しています。おそらく最下位バイト。私は、任意のテストを行っていないが、私はあなたがこのような式のものを使用した場合、それが正しい出て働くかもしれないと思う:

24-bit depth = (Blue<<16) | (Red<<8) | Green 

一例として、あなたはその式を取り、それを適用した場合(ImageMagickのを使用して)は次のようになります。

convert depth.png -fx "(((u.b*255)<<8)|(u.r*255))/65535" -auto-level result.png 

この結果は、私には少なくとも、すばらしい滑らかな奥行き画像を表示するために表示されます。

enter image description here

+0

こんにちは。私は実際にPixelvaluesについて同じことを発見し、それらの3つの画像をもたらしました。私はインターネット上で見つけたいくつかの数学的方程式を試しましたが、どれもうまくいきませんでした。数式を少し詳しく説明できますか?時間をとっていただきありがとうございます。よろしくお願いしますMarcel – Marcel

+0

左の中央から車の方に向かう途中のイメージを見ると、黒から白に至る3つの明確なバンドがあります。したがって、黒(値0)から始めて白(値255)にすると、白になると下のイメージが1レベル増加し、2進数がどのように加算されるかがわかります。最下部の画像はMSBで、先頭の画像は次の最上位バイトです.2番目のバイトが255に達すると、先頭のバイトが次のレベルにクリックされるためです。 –

+0

私は自分の答えを更新しました - 最後の部分をもう一度見てください。 –

関連する問題