※ 引述《cherrybomb (missing)》之銘言:
: 我使用的是vc2008和opencv2.0
: 使用cvLoadImage載入一張684*600的圖檔Img.bmp並且是以灰階讀取
: 我想請問為何Img->width和Img->widthStep的值會不一樣呢@ @
: IplImage如果是灰階圖片,一維陣列的元素應該就是一個值表示一個像素的灰階值吧@ @
: 不像彩色圖片的話因為一維陣列排列是BGRBGRBGR.........
: 所以BGR三個元素的值才表示一個像素的值
: 為何輸出Img->widthStep會等於684
: 輸出Img->width卻會等於682呢
: 謝謝回答~~~~~~~~!!
想藉這個標題問一下,由於最近使用opencv做影像處理的時候也碰到這個問題
以一個3*3的3 channel(RGB)來說的話,
每一行的byte數目總共為12個byte,其中為了要使得其為4的倍數所以後面多補了3個byte
因此widthstep=12
但是這多出來的3個byte再做處理的時候並不會用到,只是要對齊用的
而一般來說
如果想要對一張影像的每個像素做處理的話
opencv的作法會是
for (int i = 0; i < height;i++)
for (int j = 0; j < widthStep; j++) {
Img->imageData[i*widthStep+j]=0; //將整張圖用1-dim的方式表示
}
但是上面的程式碼卻不適用於3*3的影像,因為會出現index out of range
不知道是不是因為imageData並不會包含被align所多出來的byte???
但是我不懂為什麼我的index還是可以是i*widthStep+j ??
因為只要把第二個for迴圈的widthStep改成width,結果又正確了...
而我的想法是
如果要改成4*4(不會有byte多出來)以及3*3(會有byte多出來)的影像都適用的話
應該要把上述的程式碼改成
for (int i = 0; i < height;i++)
for (int j = 0; j < widthStep-(widthStep-width*nchannel); j++) {
Img->imageData[i*widthStep+j]=0; //將整張圖用1-dim的方式表示
}
其中 widthStep-width*nchannel=因為align而多出來的byte
也就是widthStep-(多出來的byte)=真正的ImageData
但是我在網路上沒看過有這樣的寫法@@,幾乎都是第1種居多
執行結果看起來是沒問題的
不知道我這樣的寫法是否正確?
--
~宅男的四個徵兆~
∠□ ○ ! * \○/ ★ (○ ?
╦╦└□ " ○□═ □ □>
║║√√ ╦══╦ ∥ |\
一回家就上PTT 每天想正妹 以當好人為樂 忘記正妹虧欠自己
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.63.98.165
※ 編輯: Arim 來自: 61.63.98.165 (03/19 19:30)