作者neutronstars (I'm...)
看板C_and_CPP
标题Re: [问题] memcpy 的问题?
时间Mon Jul 6 15:29:10 2009
※ 引述《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