Re: [問題] memcpy 的問題?

看板C_and_CPP (C/C++)作者 (I'm...)時間16年前 (2009/07/06 15:29), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/4 (看更多)
※ 引述《vtr198172 (43米的深海)》之銘言: : ※ 引述《vtr198172 (43米的深海)》之銘言: : : 我想利用V4L2的範例程式去擷取webcam的影像檔,但在擷取到一整個影像的buffer時, : : 可以利用memcpy這函式把buffer寫入到一個檔案裡嗎? : : 程式大概是像下面這樣子: : : FILE* fp = fopen(file_name, "w"); : : memcpy(fp, p, VIDEO_SIZE); : : fclose(fp); : : 因為我執行後會出現segment fault.. 謝謝各位 : 首先,先感謝大家的回答,後來我改用 : FILE* fp = fopen(file_name, "w"); : fwrite (p, sizeof(char), VIDEO_WIDTH*VIDEO_HEIGHT*2, fp); : fclose(fp); : 就可以了,但是想了解一下為什麼不能用memcpy呢? : 第二個問題是,我把擷取的影像寫入檔案內,用ACDSee打開後是黑的 : 應該是因為我設定V4L2的格式為 V4L2_PIX_FMT_YUYV 的關係, : 所以我要怎麼做才能轉成JPEG檔呢? 或是可以直接讓webcam抓出來的影像為RGB呢? : 謝謝各位 OpenCV預設抓出來是BGR format,不過他是存成IplImage structure 所以你應該是無法單純copy過去就ok的。 就算直接把frame->imageData存到檔案裡,你還是無法正確觀看圖片, 因為你沒有在前面加上header。 不過我看你的敘述似乎是自己寫V4L去控制webcam, 那你就得注意它給你的是經過壓縮的data raw, 也就是YUYV的形式,這部份可以google一下,應該很容易找到, 找到排列方式後,自己從裡面抓出YUV三個element,構成一個pixel, 然後將每個pixel轉成BGR後,再自己加上BMP Header, 之後Header連同影像資料寫到檔案裡, 如果沒問題就可以開啟圖檔。 如果你的目的不是玩V4L, 只是單純要frame做處理,其實OpenCV有附相關函式給你方便用, 底層也是V4L,效率也不錯, 其實就不需要自己去寫V4L的程式了。 如果你自己真的想玩, 那你還可以自己去link jpeg library,照著範例就可以寫出轉jpeg圖檔的程式, 至於能不能直接讓webcam下來的data raw就是RGB,那就看你的webcam有沒有支援, 設定方式就查一下V4L的api spec吧,其實滿多東西都可以弄的。 在OpenCV裡面其實有提供cvSaveImage函式讓你把IplImage結構存成圖片檔, 使用方法還是自己參考一下OpenCV reference吧。 至於你想要存成JPEG檔, 只要給cvSaveImage的檔名是"filename.jpg",它就會幫你處理好了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.124.182.85
文章代碼(AID): #1AKQV7xH (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1AKQV7xH (C_and_CPP)