看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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)