关于SPCAVIEW获取JPEG图片实现方法的分析
2009-06-07 12:35
561 查看
USB Camera
驱动的配套软件Spcaview
可以通过调用接口函数,实现自动定时获取一帧图片,并保存在指定目录中,其图片保存格式为标准JPEG.
具体执行操作命令:(shell
命令行形式)
#./spcaview –p x
注: P
为保存图片参数,x
为几秒钟自动保存一张
在Spcaview
的实现原代码中,关于图片获取功能实现在main
函数的spcagrab
函数中,其功能主要负责一边显示图象,一边抓取图片,作为函数调用,由程序员实现。为了实现同步操作,Spcaview
采用了创建线程的形式,通过pthread_create
创建子线程,负责读取一帧图片,解码,并保存为JPEG
格式。
其具体函数形式为:
int spcaGrab (……..) {
………….
/* laugth the picture thread */
mypict.data = malloc(frame_size);
//
分配内存空间,以保存一帧的数据
mypict.sizeIn = frame_size;
mypict.width = image_width;
mypict.height = image_height;
mypict.formatIn = format;
pthread_mutex_init(&mypict.mutex, NULL);
pthread_cond_init(&mypict.cond, NULL);
wstatus = pthread_create (&waitandshoot_id, NULL, (void *) waitandshoot, &mypict);
//waitandshoot
为线程注册函数,当线程被执行的时候,即执行waitandshoot
中的代码。
…………
}
由上面的关键代码pthread_create
可知,&mypict
传递了关键数据结构给子线程,且mypict
结构中的data
而子线程依据mypict.data
中数据信息,处理图形数据,并解码保存图片。
当线程被建立以后,mypict.data
所指向的内存空间还为空,可以推断,后面一定会有给它加载数据的操作,其具体的操作为:
memcpy (mypict.data,tmp,frame_size);
tmp
为一字符指针,指向主程序所取得的数据信息:
unsigned char *tmp
;(定义在main
函数开始)
主程序中获得一帧数据的方法与实现:
进程要通过驱动读取Camera
数据,可以通过两种方式,第一种
是通过内存映射,使用mmap
系统调用,将缓冲区直接影射到进程自己的用户空间,对frame buffer
进行直接操作,获取帧数据。第二种
是通过read
系统调用,只读取其中一帧大小的数据,并直接对其操作,而不进行内存映射。
在Spcaview
的代码实现中,这两种方法都有实现,由if
语句进行选择,程序按照参数grabMethod
的值进行不同操作,才用不同方法读取帧数据。
其具体的代码如下:
Mmap
方法的实现代码:
//mmap
实现内存映射,将buffer
从内核空间映射到进程空间
pFramebuffer =(unsigned char *) mmap (0, videombuf.size,
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
if (grabMethod) {
memcpy (tmp,
pFramebuffer +
videombuf.offsets[vmmap.frame],
frame_size);
//
将具体的一帧数据拷贝到tmp
,传递给子线程,videombuf.offsets[vammp.frame]
为frame.buffer
中具体一帧的偏移地址。
vmmap.frame = (vmmap.frame + 1) % videombuf.frames;
//
通过求余运算,循环取帧。
} else {
Read
方法的实现代码:
/* read method */
len = read (fd, tmp, frame_size);
//
直接读取一帧数据,最为简洁
}
以上两种方法,都能简洁的获取一帧的数据,并获得很好的效果,是抓图功能的低层实现,均调用的的是Linux
用户C
库的函数,而没有使用其他三方库的支持。再往下,即是内核通过file_operation
结构调用驱动程序实现的向上接口。
原文地址:未知
驱动的配套软件Spcaview
可以通过调用接口函数,实现自动定时获取一帧图片,并保存在指定目录中,其图片保存格式为标准JPEG.
具体执行操作命令:(shell
命令行形式)
#./spcaview –p x
注: P
为保存图片参数,x
为几秒钟自动保存一张
在Spcaview
的实现原代码中,关于图片获取功能实现在main
函数的spcagrab
函数中,其功能主要负责一边显示图象,一边抓取图片,作为函数调用,由程序员实现。为了实现同步操作,Spcaview
采用了创建线程的形式,通过pthread_create
创建子线程,负责读取一帧图片,解码,并保存为JPEG
格式。
其具体函数形式为:
int spcaGrab (……..) {
………….
/* laugth the picture thread */
mypict.data = malloc(frame_size);
//
分配内存空间,以保存一帧的数据
mypict.sizeIn = frame_size;
mypict.width = image_width;
mypict.height = image_height;
mypict.formatIn = format;
pthread_mutex_init(&mypict.mutex, NULL);
pthread_cond_init(&mypict.cond, NULL);
wstatus = pthread_create (&waitandshoot_id, NULL, (void *) waitandshoot, &mypict);
//waitandshoot
为线程注册函数,当线程被执行的时候,即执行waitandshoot
中的代码。
…………
}
由上面的关键代码pthread_create
可知,&mypict
传递了关键数据结构给子线程,且mypict
结构中的data
而子线程依据mypict.data
中数据信息,处理图形数据,并解码保存图片。
当线程被建立以后,mypict.data
所指向的内存空间还为空,可以推断,后面一定会有给它加载数据的操作,其具体的操作为:
memcpy (mypict.data,tmp,frame_size);
tmp
为一字符指针,指向主程序所取得的数据信息:
unsigned char *tmp
;(定义在main
函数开始)
主程序中获得一帧数据的方法与实现:
进程要通过驱动读取Camera
数据,可以通过两种方式,第一种
是通过内存映射,使用mmap
系统调用,将缓冲区直接影射到进程自己的用户空间,对frame buffer
进行直接操作,获取帧数据。第二种
是通过read
系统调用,只读取其中一帧大小的数据,并直接对其操作,而不进行内存映射。
在Spcaview
的代码实现中,这两种方法都有实现,由if
语句进行选择,程序按照参数grabMethod
的值进行不同操作,才用不同方法读取帧数据。
其具体的代码如下:
Mmap
方法的实现代码:
//mmap
实现内存映射,将buffer
从内核空间映射到进程空间
pFramebuffer =(unsigned char *) mmap (0, videombuf.size,
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
if (grabMethod) {
memcpy (tmp,
pFramebuffer +
videombuf.offsets[vmmap.frame],
frame_size);
//
将具体的一帧数据拷贝到tmp
,传递给子线程,videombuf.offsets[vammp.frame]
为frame.buffer
中具体一帧的偏移地址。
vmmap.frame = (vmmap.frame + 1) % videombuf.frames;
//
通过求余运算,循环取帧。
} else {
Read
方法的实现代码:
/* read method */
len = read (fd, tmp, frame_size);
//
直接读取一帧数据,最为简洁
}
以上两种方法,都能简洁的获取一帧的数据,并获得很好的效果,是抓图功能的低层实现,均调用的的是Linux
用户C
库的函数,而没有使用其他三方库的支持。再往下,即是内核通过file_operation
结构调用驱动程序实现的向上接口。
原文地址:未知
相关文章推荐
- php利用curl获取远程图片实现方法
- Android实现从网络获取图片显示并保存到SD卡的方法
- android利用Http协议实现从网络上面获取图片的方法
- JS实现淡入淡出图片效果的方法分析
- PHP文字转图片功能原理与实现方法分析
- js从外部获取图片的实现方法
- JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
- php获取远程图片并下载保存到本地的方法分析
- 关于JS判断图片是否加载完成且获取图片宽度的方法
- 关于JS获取select值的两种实现方法
- 关于JS判断图片是否加载完成且获取图片宽度的方法
- js 获取网络图片的高度和宽度的实现方法(变通了下)
- 图片滚动特效实现方法的分析(JavaScript)
- Android实现从网络获取图片显示并保存到SD卡的方法
- IOS关于从照相机获取图片的问题,初步探究通过摄像头实现颜色与形状识别机制==
- Android编程实现获取图片资源的四种方法
- ASP.NET 实现通过URL 获取远程的图片或者文件方法
- php实现获取文章内容第一张图片的方法
- dedecms获取图片集多张图片实现方法(循环输出)