最近,我在做並行影象合成的工作,所以我需要把vtk管線中畫好的圖在顯示之前把這些畫素點取出來,並與其它程序所繪製的畫素點相融合,進行深度測試。所以需要了解vtk在畫素緩衝區的讀取上是怎麼做的。
我們都知道,在opengl中我們都知道,是用glreadpixels()和glgetteximage()這樣的函式把畫素讀取到內存在來的,然後呼叫glmapbuffer()或者glgetbuffersubdata()訪問緩衝區中物件中的數值,這兩個函式我不是很熟悉,這裡就不多說了。
因為我現在做的這個東西,是基於vtk來實現的,而vtk對這一操作是有封裝的,所以首先我們需要知道vtk是在哪個類的那個函式中對這一功能進行了封裝實現。我們想到這個功能應該是基於視窗的,在vtk中,vtkrenderwinodw這個類他是管理所有與視窗相關的事情,像各種opengl的初始化的引數,上下文的設定,都是由這個類實現的。所以我們可以想到這個類應該是直接與opengl在引數設定方面相關的,也就是在整個流水線的開始繪製之前,和繪製之後的事情,應該是在這裡實現的。最終我們發現在vtkopenglrenderwindow這個類中有對這個功能的封裝,它分別提供了獲取畫素:
getrgbapixeldata(int x1,int y1,int x2,int y2,int front),返回型別為float*。
和寫入畫素:
setrgbapixeldata(int x1,int y1,int x2,int y2,float *data,int front,int blend)
其中x1,y1,x2,y2是一塊矩形畫素的左下角和右上角,這裡需要注意的是,按座標系來講,這裡vtk把螢幕設為從左下角開始往右填,然後再往上。也就是如果從二維來講,左下角為原點,橫座標正方向為向右,縱座標正方向為往上。但是我們要知道的是,從這兩個函式中取出來的畫素為一維的乙個陣列,他的順序其實就是從原點開始按x正方向開始填滿每一行往上的乙個順序。
這裡還有乙個要注意的是,int x1,int y1,int x2,int y2它是取出的來的畫素點的個數是(x2-x1+1)*(y2-y1+1)個畫素點,而不是我們想的(x2-x1)*(y2-y1)個,所以他是兩邊都取到,同樣的在set中也是這樣的,你放進去的畫素點不夠的話就可能出現錯位和出現白條的現象。
所以我們在使用的時候。例如解析度是1920*1080的,我們就要取的是(0,0,1920-1,1080-1),這樣的話才能拿到的是完整的圖形,如果不減1的話拿到的圖形會是在右邊多乙個白條。因為裡面是沒有畫素的。開始的時候我就遇到了這個問題,在範圍和畫素上沒有取得同步,導致圖形發生偏斜並且出現乙個白條。並且需要注意的是我們這樣取到的畫素點也是閉區間的,兩邊畫素點都是有的。
這裡還有乙個需要注意的是,螢幕原來是從左下角開始填充畫素點的。
綜上所述,我在基於vtk做影象的拼合的時候,在畫素讀取和寫入這個過程中遇到以上兩個問題:
1.讀取畫素處理完之後寫進去,發生偏移,在除錯的時候一直不理解為啥有一條從下往左上斜的白線,原來是那個函式取的是閉區間的畫素點,在算每一行的畫素個數的時候要記得+1.或者for迴圈的時候就不要採用<=,採用<。
2.我們得到的畫素的一維陣列這個陣列是從螢幕的左下角開始填滿整個螢幕的。
畫素資料的儲存
乙個黑白畫素和乙個彩色畫素分別佔幾個位元組?取決於需要儲存乙個畫素的多少資訊,以及是否採用了壓縮技術。如果是非黑即白的二值影象,不壓縮的情況下乙個畫素只需要1個bit。如果是256種狀態的灰度影象,不壓縮的情況下乙個畫素需要8bit 1位元組,256種狀態 如果用256種狀態標識螢幕上某種顏色的灰度...
OpenCV畫素資料型別
1 unsigned 8bits 注 一般影象結構引數 mat資料結構引數 cv 8uc1,cv 8uc2,cv 8uc3,cv 8uc4 變數型別 空間大小 範圍uchar 8bits 0 255 unsigned char 8bits 0 255 2 signed 8bits mat資料結構引數...
scanf,getchar讀取字元和緩衝區
首先我們來看這樣一段 include intmain printf 請輸入密碼 scanf s password printf 請確認密碼 y n int ch getchar if ch y else 是不是有些同學會認為輸完密碼後,再輸入y就會列印出確認成功呢,但實際上卻並是這樣 可以看到程式並...