天嵌 ARM开发社区

 找回密码
 注册
查看: 3948|回复: 14

TQ2440怎么捕获摄像头单幅图片

[复制链接]
wyz365889 发表于 2012-3-1 09:51:04 | 显示全部楼层 |阅读模式
我想用通过摄像头抓拍图片,就是触发某事件时,我抓拍一幅图片,格式为jpeg!
anbokeji 发表于 2012-3-1 16:38:07 | 显示全部楼层
你是用什么驱动的摄像头的 呵呵  如果 你懂的驱动摄像头的驱动程序的话 我想抓拍应该不是什么问题 呵呵
回复

使用道具 举报

TQ_guoxixiao 发表于 2012-3-1 17:19:34 | 显示全部楼层
我们内核源码摄像头驱动里面有这样的接口函数。
只需要调用相应的接口函数就可以了
回复

使用道具 举报

 楼主| wyz365889 发表于 2012-3-2 11:14:43 | 显示全部楼层
anbokeji 发表于 2012-3-1 16:38
你是用什么驱动的摄像头的 呵呵  如果 你懂的驱动摄像头的驱动程序的话 我想抓拍应该不是什么问题 呵呵

主要是不怎么懂驱动。问下,相关步骤是怎么弄的,或者调用哪个函数,怎么设置。简单的说下就行。

先谢了!
回复

使用道具 举报

 楼主| wyz365889 发表于 2012-3-2 11:18:17 | 显示全部楼层
TQ_guoxixiao 发表于 2012-3-1 17:19
我们内核源码摄像头驱动里面有这样的接口函数。
只需要调用相应的接口函数就可以了

谢谢版主回复!
问下要调用哪个接口函数,怎么设置?
能否简单的告诉步骤下?
回复

使用道具 举报

 楼主| wyz365889 发表于 2012-3-2 11:20:13 | 显示全部楼层
anbokeji 发表于 2012-3-1 16:38
你是用什么驱动的摄像头的 呵呵  如果 你懂的驱动摄像头的驱动程序的话 我想抓拍应该不是什么问题 呵呵

usb摄像头信息如下:

uvcvideo: Non-zero status (-62) in status completion handler.
usb 1-1.4: USB disconnect, address 3
usb 1-1.4.1: USB disconnect, address 4
usb 1-1.4.2: USB disconnect, address 5
usb 1-1.4: new full speed USB device using s3c2410-ohci and address 6
usb 1-1.4: New USB device found, idVendor=05e3, idProduct=0608
usb 1-1.4: New USB device strings: Mfr=0, Product=1, SerialNumber=0
usb 1-1.4: Product: USB2.0 Hub
usb 1-1.4: configuration #1 chosen from 1 choice
hub 1-1.4:1.0: USB hub found
hub 1-1.4:1.0: 4 ports detected
usb 1-1.4.1: new full speed USB device using s3c2410-ohci and address 7
usb 1-1.4.1: New USB device found, idVendor=1871, idProduct=0d01
usb 1-1.4.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1.4.1: Product: USB2.0 Camera
usb 1-1.4.1: Manufacturer: AVEO Technology Corp.
usb 1-1.4.1: configuration #1 chosen from 1 choice
uvcvideo: Found UVC 1.00 device USB2.0 Camera (1871:0d01)
input: USB2.0 Camera as /devices/platform/s3c2410-ohci/usb1/1-1/1-1.4/1-1.4.1/1
1.4.1:1.0/input/input2
usb 1-1.4.2: new low speed USB device using s3c2410-ohci and address 8
usb 1-1.4.2: New USB device found, idVendor=1d57, idProduct=ac01
usb 1-1.4.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1.4.2: Product: HID-compliant Mouse
usb 1-1.4.2: Manufacturer: HID-compliant Mouse
usb 1-1.4.2: configuration #1 chosen from 1 choice
input: HID-compliant Mouse HID-compliant Mouse as /devices/platform/s3c2410-ohc
/usb1/1-1/1-1.4/1-1.4.2/1-1.4.2:1.0/input/input3
generic-usb 0003:1D57:AC01.0002: input: USB HID v1.10 Mouse [HID-compliant Mous
HID-compliant Mouse] on usb-s3c24xx-1.4.2/input0

或者TQ2440自动的cmos摄像头也行,反正我就是能抓拍到图片就行了。
回复

使用道具 举报

 楼主| wyz365889 发表于 2012-3-5 11:08:17 | 显示全部楼层
TQ_guoxixiao 发表于 2012-3-1 17:19
我们内核源码摄像头驱动里面有这样的接口函数。
只需要调用相应的接口函数就可以了

问下版主,这个接口是哪个,能否告知相关步骤!
回复

使用道具 举报

亚瑟王 发表于 2012-3-5 18:04:51 | 显示全部楼层
亲,usb摄像头使用的是v4l2协议,这个百度一下很多相关说明的。
特别说明一下:usb摄像头采集到的有yuyv格式的和jpeg格式的图片,如果yuv格式的需要转化一遍。jpeg的直接保存即可。
回复

使用道具 举报

 楼主| wyz365889 发表于 2012-3-6 11:09:00 | 显示全部楼层
亚瑟王 发表于 2012-3-5 18:04
亲,usb摄像头使用的是v4l2协议,这个百度一下很多相关说明的。
特别说明一下:usb摄像头采集到的有yuyv格 ...

特别问下:usb怎么知道采集到的是yuyv格式或jpeg格式图片。

还有就是cmos图片捕获也是一样用v4l2方法吗?

:handshake
回复

使用道具 举报

TQ-lkp 发表于 2012-3-6 12:18:03 | 显示全部楼层
格式是自己设置的,要注意的是usb摄相头不一定支持你想要的格式,设置前要先查询下摄相头支持哪种格式再进行设置
抓图就是读取一帧数据,使用jpeg库压缩后保存成文件
回复

使用道具 举报

 楼主| wyz365889 发表于 2012-3-6 14:16:27 | 显示全部楼层
TQ-lkp 发表于 2012-3-6 12:18
格式是自己设置的,要注意的是usb摄相头不一定支持你想要的格式,设置前要先查询下摄相头支持哪种格式再进行 ...

版主,怎么知道自己的摄像头支持哪种格式?
回复

使用道具 举报

亚瑟王 发表于 2012-3-6 16:38:36 | 显示全部楼层
亲,在V4L里面有控制字来获取到格式的。天嵌科技提供的apps压缩包里面的usb摄像头程序里面有的,你可以参考一下。
回复

使用道具 举报

 楼主| wyz365889 发表于 2012-3-7 09:29:05 | 显示全部楼层
本帖最后由 wyz365889 于 2012-3-7 09:30 编辑

/*

*   TQ2440 camera test program

*

*   preview : 320x240 overlay on 320x240 16bpp LCD

*

*   TFT LCD size : 320x240

*/

#include <sys/time.h>

#include <sys/types.h>

#include <asm/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <sys/ioctl.h>

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/mman.h>

#include <errno.h>



#include <linux/fs.h>

#include <linux/kernel.h>

#include "videodev.h"

#include "videodev2.h"

#include <linux/fb.h>



#define PIXFMT_NUM                        5

#define INPUT_NUM                         5

#define CTRL_NUM                         100



#define V4L2_DEV_NODE                        "/dev/camera"

#define FB_DEV_NODE                        "/dev/fb/0"


//typedef struct v4l2_input    V_INPUT;

//typedef struct v4l2_format   V_FORMAT;

//typedef struct v4l2_fmtdesc  V_FMTDESC;

//typedef struct v4l2_queryctrl V_QRYCTRL;



typedef struct fb_var_screeninfo F_VINFO;



unsigned int x_lcd_size, y_lcd_size;



static void v4l2_show_on_fb(int fd, char *fbmem, int frames)

{

        int i;

        int ret;

        char preview_buf[240*320*2];

        
        while(1) {

                        if ((ret = read (fd, &preview_buf, 240*320*2)) < 0) {

                                perror("read");

                                return;

                        }

        #if 1                        //for 320*240,640*480,800*480

                        {

                        int y;

                        for (y = 0; y < 240; y++)

                                memcpy(fbmem + x_lcd_size*2*y, preview_buf + 320*2*y, 320*2);

                        }

        #else                        //for 240*320

                        memcpy(fbmem, &preview_buf, 240*320*2);

        #endif

                        fflush(stdout);

        }
        

        printf("\n");

}



static unsigned int fb_grab(int fd, char **fbmem)

{

        F_VINFO modeinfo;

        unsigned int length;



        if (ioctl(fd, FBIOGET_VSCREENINFO, &modeinfo) < 0) {

                perror("FBIOGET_VSCREENINFO");

                exit (EXIT_FAILURE);

        }

        length = modeinfo.xres * modeinfo.yres * (modeinfo.bits_per_pixel >> 3);



        x_lcd_size=modeinfo.xres;             //width of tft lcd

        y_lcd_size=modeinfo.yres;             //height of tft lcd



        printf("fb memory info=xres (%d) x yres (%d), %d bpp\n",

                        modeinfo.xres, modeinfo.yres, modeinfo.bits_per_pixel);



        *fbmem = mmap(0, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

        if (*fbmem < 0) {

                perror("mmap()");

                length = 0;

        }



        return length;

}



static void fb_ungrab(char **fbmem, unsigned int length)

{

        if (*fbmem)

                munmap(*fbmem, length);

}





int main(int argc, char *argv[])

{

        int v4l2_fd = -1;

        int fb_fd = -1;

        char *fbmem = NULL;

        unsigned int fb_length = 0;


        int preview_frames = 180;

        int tmp;


        printf("TQ2440 Camera Test Program, Start !\n");
        if (argc > 1) {

                if (sscanf(argv[1], "%d", &tmp) == 1)

                        preview_frames = tmp;

        }



        v4l2_fd = open(V4L2_DEV_NODE, O_RDWR);

        if (v4l2_fd < 0) {

                perror(V4L2_DEV_NODE);

                goto out;

        }



        fb_fd = open(FB_DEV_NODE, O_RDWR);

        if (fb_fd < 0) {

                perror(FB_DEV_NODE);

                goto out;

        }

        

        fflush(stdout);

        if ((fb_length = fb_grab(fb_fd, &fbmem)) == 0)

                goto out;

        memset(fbmem, 0, fb_length);


        printf("Press Ctrl+C to stop !\n");

        fflush(stdout);



        v4l2_show_on_fb(v4l2_fd, fbmem, preview_frames);

        

        printf("\n");



out:



        if (v4l2_fd > 0)

                close(v4l2_fd);



        fb_ungrab(&fbmem, fb_length);



        return 0;

}


回复

使用道具 举报

 楼主| wyz365889 发表于 2012-3-7 09:30:17 | 显示全部楼层
亚瑟王 发表于 2012-3-6 16:38
亲,在V4L里面有控制字来获取到格式的。天嵌科技提供的apps压缩包里面的usb摄像头程序里面有的,你可以参考 ...

上面程序可以把图像显示在LCD上,请问怎么把图像保存成jpeg
回复

使用道具 举报

亚瑟王 发表于 2012-3-8 19:03:17 | 显示全部楼层
wyz365889 发表于 2012-3-7 09:30
上面程序可以把图像显示在LCD上,请问怎么把图像保存成jpeg

亲,将放到fb的数据用数组保存,然后调用JPEG库将其转成JPEG图片即可。论坛中有JPEG库的参考资料可以下载使用的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-5-4 16:56 , Processed in 2.034861 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表