2017-04-19 12 views
0

到目前爲止,每當我有一個問題時,這個社區幫助我,而不必問我一個問題,但今天我不得不問我的第一個問題,因爲我找不到答案我非常渴望社區的幫助。從共享內存中保存4字節的pP深度圖像

我正在使用將圖像寫入共享內存的模擬程序。訪問內存地址,我想保存圖像。模擬發送兩個圖像,一個是正常的,一個是深度信息。用普通的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爲單位發送到共享內存te每像素圖像和一個像素總是有價值255.這些信息不幫助我,但也許你。

我對圖像處理的所有知識我認爲我的自我,在這一點上,我真的不知道該怎麼做。

Image Micka requested

+0

什麼類型是img? sizeof(RDB_IMAGE_t)的值是什麼;? – Micka

+1

您可以刪除cvtColor行並將圖像保存爲.png並上傳它嗎? – Micka

+1

標題說「4位深度」,文字說「每個像素4字節」,那麼它是哪一個?你也不能只是檢查共享內存或在每一步後轉儲它以找出腐敗發生的時間? – VTT

回答

0

如果拆分您提供成其組成通道中的圖像,你會發現幾件事情。

首先,它有4個通道 - 讓我們假設它們是R,G,B和A(儘管它們實際上不是)。其次,最後兩個通道是相同的 - 它們的最小/最大值和標準偏差是相同的,所以我們可以丟棄其中的一個通道。

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通道中較大步驟之間的平滑漸變,所以我想這是中間字節,第二個圖像變化最大,所以這是可能是最不重要的字節。我沒有做任何測試,但我想如果你使用的公式是這樣的,它可能會制定出正確的:

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

+0

如果你看中間的圖像,從左側中間進入圖像的汽車,有三個清晰的樂隊從黑色到白色。所以,如果你以黑色開始(值爲0),然後建立到白色(值爲255),你可以看到,當你變成白色時,底部圖像增加1級,這是二進制數如何相加,所以底部圖像是MSB,頂部圖像是下一個最重要的字節,因爲當第二個字節達到255時,頂部字節會被點擊到下一個級別。 –

+0

我已經更新了我的答案 - 請再看看最後一部分。 –