Re: [問題] memcpy 的問題?
看板C_and_CPP (C/C++)作者neutronstars (I'm...)時間16年前 (2009/07/06 15:29)推噓0(0推 0噓 0→)留言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
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章