看板 C_and_CPP 關於我們 聯絡資訊
( *[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
holydc:http://0rz.tw/pq6UD 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