主题 : mini2440 USB摄像头应用程序 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 45009
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
贡献值: 0 点
综合积分: 28 分
注册时间: 2011-04-30
最后登录: 2013-04-30
楼主  发表于: 2011-12-14 17:31

 mini2440 USB摄像头应用程序

程序来自网络上具体来源未知。程序已经在 mini2440上测试过,运行编译的执行文件会在当前目录下保存一张图片。
摄像头型号 -zp301.

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <error.h>
#include <fcntl.h>
#include <sys/types.h>
#include <linux/videodev.h>
//#include "v4l.h"

#include <linux/videodev.h>
#include <sys/types.h>




#define DEFAULT_DEVICE "/dev/video0"




#include <string.h>
#define norm VIDEO_MODE_NTSC
#define DEFAULT_FILE_NAME "picture"


//PAL CIF NTSC tuner mode
#define PAL_WIDTH 768
#define PAL_HEIGHT 576
#define CIF_WIDTH 352
#define CIF_HEIGHT 288
#define NTSC_WIDTH 80  //
#define NTSC_HEIGHT 60
#define DEFAULT_PALETTE VIDEO_PALETTE_RGB32

struct _v4l_device
{
    int fd;
    struct video_capability capability;
    struct video_picture picture;
    struct video_window window;
    struct video_channel channel[8];
    struct video_mbuf mbuf;
    struct video_capture capture;
    struct video_buffer buffer;
    struct video_mmap mmap;
    unsigned char *map;
    int frame;
    int framestat[2];
};
typedef struct _v4l_device v4ldevice;


int v4l_open(char *dev,v4ldevice *vd)
{
    if (!dev){dev = DEFAULT_DEVICE;} ;

    if((vd->fd=open(dev,O_RDWR,10705))<0)
    {
        return -1;
    };
    if(v4l_get_capability(vd)<0)
        return -1;
    if(v4l_get_picture(vd)<0)
        return -1;
    return 0;
}

int v4l_get_capability(v4ldevice *vd)
{
    if(ioctl(vd->fd,VIDIOCGCAP,&(vd->capability))<0)
    {  
        perror("v4l_get_capability:");
        return -1;
    };

   return 0;

}

int v4l_get_picture(v4ldevice *vd)
{
    if(ioctl(vd->fd,VIDIOCGPICT,&(vd->picture))<0)
    {
        perror("v4l_get_picture");
        return -1;      
    };

   return 0;


}



    int v4l_set_norm(v4ldevice *vd, int nrm)

    {
    int i;
    for(i=0;i< vd->capability.channels ; i++){
//    vd->channel=nrm ;
    };
  
    return 0;

    }





int v4l_grab_init(v4ldevice *vd,int width,int height)
{
    vd->mmap.width=width;
    vd->mmap.height=height;
    vd->mmap.format=vd->picture.palette;
    vd->frame=0;
    vd->framestat[0]=0;
    vd->framestat[1]=0;  
    return 0;
}

int v4l_mmap_init(v4ldevice *vd)
{
    if(v4l_get_mbuf(vd)<0)
        return -1;
    if((vd->map=mmap(0,vd->mbuf.size,PROT_READ|PROT_WRITE,MAP_SHARED,vd->fd,0)
)<0)
    {
        return -1;
    }
    return 0;
}

int v4l_get_mbuf(v4ldevice *vd)
{
    if(ioctl(vd->fd,VIDIOCGMBUF,&(vd->mbuf))<0)
    {
        perror("v4l_get_mbuf:");  
        return -1;
    }
    printf("size=%d\n",vd->mbuf.size);
    return 0;
}

int v4l_grab_start(v4ldevice *vd,int frame)
{
    vd->mmap.frame=frame;
    if(ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->mmap))<0)
    {
        exit(-1);
        return -1;
    }
    vd->framestat[frame]=1;
    return 0;
}
int v4l_grab_sync(v4ldevice *vd,int frame)
{
    if(ioctl(vd->fd,VIDIOCSYNC,&frame)<0)
    {
        return -1;  
    }
    vd->framestat[frame]=0;
    return 0;
}

unsigned char * v4l_get_address(v4ldevice *vd)
{
    return (vd->map+vd->mbuf.offsets[vd->frame]);
}

int v4l_close(v4ldevice *vd)
{
    close(vd->fd);
    return 0;
}

/*************************************************************/

/******************main.c************************/

/*name :main.c

  date:2009-5-20

  author:kevin

  copyright:all is reserved

************************************/

int main()
{

    char *buffer=NULL;
    v4ldevice VD;
    v4ldevice *vd=&VD;

    int frame=0;
    int f_d;

    f_d=open(DEFAULT_FILE_NAME,O_RDWR|O_CREAT,0666);
  
    if(0==v4l_open("/dev/video0",vd))
        printf("open success!\n");
    else
        printf("open failure\n");

    if(0==v4l_set_norm(vd,norm))
        printf("set_norm success\n");
    else
        printf("set_norm failure\n");
    if(0==v4l_grab_init(vd,NTSC_WIDTH,NTSC_HEIGHT))

        printf("init success!\n");
    else
        printf("init failure\n");
    if(0==v4l_mmap_init(vd))
        printf("memory map success!\n");
    else
        printf("memory map failure\n");
    if(0==v4l_grab_start(vd,frame))
        printf("get picture success!\n");
    else
        printf("get picture failure\n");    

   v4l_grab_sync(vd,frame);
      
        buffer=(char *)v4l_get_address(vd);
        printf("img address %p\n",buffer);

    write(f_d,buffer,NTSC_WIDTH*3*NTSC_HEIGHT);  

    v4l_close(vd);
    return 0;
  
}
描述:mini2440
附件: v4l.rar (2 K) 下载次数:176
级别: 新手上路
UID: 61952
精华: 0
发帖: 11
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2012-01-11
最后登录: 2012-03-08
1楼  发表于: 2012-01-11 16:27
           感谢分享。        大家怎么都没有反应的。
级别: 新手上路
UID: 63176
精华: 0
发帖: 24
金钱: 125 两
威望: 25 点
贡献值: 0 点
综合积分: 48 分
注册时间: 2012-02-15
最后登录: 2013-03-14
2楼  发表于: 2012-02-16 10:15
感谢分享 我下下来试试
级别: 新手上路
UID: 63245
精华: 0
发帖: 33
金钱: 165 两
威望: 33 点
贡献值: 0 点
综合积分: 66 分
注册时间: 2012-02-16
最后登录: 2012-11-22
3楼  发表于: 2012-02-22 16:23
正准备做这个东东,不过目前什么都不懂
级别: 新手上路
UID: 59311
精华: 0
发帖: 30
金钱: 175 两
威望: 35 点
贡献值: 0 点
综合积分: 60 分
注册时间: 2011-11-22
最后登录: 2012-08-18
4楼  发表于: 2012-05-08 15:47
正准备测试,谢谢分享
级别: 新手上路
UID: 66736
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2012-04-02
最后登录: 2012-11-11
5楼  发表于: 2012-05-19 15:19
memory map failure  楼主我的好像是提示内存映射有问题,这个怎么解决呀!
级别: 新手上路
UID: 67412
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
贡献值: 0 点
综合积分: 38 分
注册时间: 2012-04-11
最后登录: 2013-10-18
6楼  发表于: 2012-06-12 14:59
open success!
set_norm success
init success!
v4l_get_mbuf:: Invalid argument
memory map failure
级别: 新手上路
UID: 49158
精华: 0
发帖: 12
金钱: 65 两
威望: 13 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2011-06-08
最后登录: 2012-09-23
7楼  发表于: 2012-06-25 15:48
感谢,亲测可用。编译指令“arm-linux-gcc -g -o v4l v4l.c”