作者hardman1110 (笨小孩)
看板C_and_CPP
標題[問題] openCV中的IplImage結構
時間Wed Nov 3 18:43:52 2010
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 )
( 未必需要依照此格式,文章條理清楚即可 )
遇到的問題: (題意請描述清楚)
我想將AVI檔用cvCaptureFromAVI() 讀入,再將數值存入2維陣列後輸出
當frame寬度為4的倍數時,顯示皆正常,如果不是則歪斜,我知道它會
做補齊的動作,我的frame->align=4 frame->width=318 但我的
frame->widthstep 居然是954... 它的row不是會補齊為4的倍數嗎?
如果不會那為何我的圖片會歪斜?
希望得到的正確結果:
正常得播放圖片
程式跑出來的錯誤結果:
圖片有歪斜
開發平台: (例: VC2008, Windows)
有問題的code: (請善用置底文標色功能)
for(int i=0;i<H;i++) //copy frame to matrix
{
for(int j=0;j<W;j++)
{
imgbuf->r2[H-i-1][j]=(unsigned char)frame->imageData[i*frame->widthStep
+j*3]; //B
imgbuf->r1[H-i-1][j]=(unsigned char)frame->imageData[i*frame->widthStep
+j*3+1]; //G
imgbuf->r0[H-i-1][j]=(unsigned char)frame->imageData[i*frame->widthStep
+j*3+2]; //R
}
}
for(int i=0;i<H;i++) // write value of matrix to frame
{
for(int j=0;j<W;j++)
{
frame->imageData[i*frame->widthStep+j*3]=(char)imgout->r2[H-i-1][j]; //B
frame->imageData[i*frame->widthStep+j*3+1]=(char)imgout->r1[H-i-1][j]; //G
frame->imageData[i*frame->widthStep+j*3+2]=(char)imgout->r0[H-i-1][j]; //R
}
}
補充說明:
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.13.132.136
※ 編輯: hardman1110 來自: 163.13.132.136 (11/03 18:47)
推 joefaq:第二段 frame->imageDataOrigin[...] 11/03 19:07
→ hardman1110:請問是將imageData改成imageDataOrigin嗎? 改了但一樣 11/03 19:27
推 ericinttu:有試過其他avi file嗎? 印象中opencv的讀影片有些開不了 11/03 20:21
推 joefaq:會歪斜就是你傳輸值的過程沒有對齊 所以你有用到的地方都要 11/03 20:52
→ joefaq:改 11/03 20:52
推 genghiskii:必須是4的倍數 11/03 22:18
→ hardman1110:都改成imageDataOrigin了,但還是不ok,是方法錯誤? 11/03 23:58
推 wa120:widthstep不一定是四的倍數,因為有可會有alignment 11/04 00:24
推 holydc:access pixel 可以看一下 OpenCV Wiki faq 的這一段 11/04 01:10
→ hardman1110:holydc你好,你提供的網址我看過了,他並沒有處理寬 11/04 10:55
→ hardman1110:不為4倍數的動作,且他的程式跑出來一樣有錯 11/04 10:56
推 holydc:歪斜是畫出來會變型嗎?? 11/07 00:53
→ hardman1110:就畫面無法對齊,應該是記憶體沒對齊造成的`, 11/09 08:59
→ hardman1110:我就算畫面抓下來直接輸出不處理也會歪掉 11/09 09:00
→ firose:imageDataOrigin 是給 cvFree_ 釋放空間用 改成它應該沒用 11/09 22:54
→ firose:但為何 widthstep 不為四的倍數 我也不清楚 滿想知道原因的 11/09 22:56