logo
한국어 Select Language
FF 포럼
포럼지기에게 한 마디
공지사항
뉴스 EZ보드 통합 메뉴얼
FA-VUS 개발환경 !강추! 타켓보드 부팅-HyperTerminal 타켓보드 부팅-Tutty 타켓보드 부팅-minicom Windows환경-타겟 Linux 구동 Linux환경-타겟 Linux 구동 개발 시스템 구축 유형 페도라 설치 CentOS 설치 크로스 컴파일러 설치 TFTP 환경 구축 NFS 파일 시스템 구축 삼바 서버 구축 부트로더 부트로더 쓰기 커널 이미지 제작 및 설치 램디스크 이미지 제작 및 설치
임베디드 제품 사용기 오늘의 영어 휴게실 Appliance
강좌 & 팁
강좌 & 팁 EZ-보드 그래픽 & 멀티미디어 네트워크 프로그래밍 디바이스 드라이버 ImJa 솔루션 임베디드 FLEX 안드로이드 iOS 개발 FAIDE 하드웨어 C/C++ go언어 GNU C 레퍼런스 메뉴얼 ARM 루아 응용 프로젝트 이클립스 지그비 개발자 노트 권장도서 FPGA
VIVADO DSP HSIO Logic Zynq
함수설명
C 라이브러리 함수 커널 API 그래픽 라이브러리 - gxLib
자료실
자료실 FALINUX SDK ARM PC-V210 S3C6410
G100-S3C6410 S100-S3C6410 C221-S3C6410 N200-S3C6410 EZ-S3C6410
S5PV210
G100-S5PV210 S100-S5PV210 N200-S5PV210 C221-S5PV210
EZ-S3C2440 EZ-PXA270 EZ-X5 EZ-S2410 Auto Package
도와주세요
FAQ 도와주세요

  • 회원가입
  • ID/PW 찾기
 
  1. FAQ

  2. 도와주세요


최근 글

  • [특판][성Y인Y용Y품][...
  • 요즘 잘 나가는,,,
  • 요즘은 vmware 말고 ...
  • [docker] buildx 를 ...
  • buildroot 사용 관련
  • GPIO 제어 방법 문의 [1]
  • 임베디드 리눅스 개발...
  • make wandboard_quad ...
  • LCD 초기화 코드 좀 ... [1]
  • 임베디드 리눅스 커널...

최근 댓글

  • 오래 전에 해결법을 터득해서 ...
  • 비트 코인으로 작업하는 것은 ...
  • 10년차 임베 엔지니어 입니다. ...
  • 임베디드쪽이라면 SOC 쪽 displ...
  • 그렇군요 제가 질문이 잘못됬었...
  • 취준생으로서 포트폴리오를 만...
  • 제가 현재 취업준비생입니다. ...
  • 에프에이리눅스 보드는 아래 링...
  • 전체
  • 일반
  • X5
  • S2410
  • ESP-NS
  • S3C2440
  • EP9312
  • 구매
  • 기타

일반 V4L과 프레임 버퍼 관련 질문입니다.

2007.11.21 03:52

조금산 조회 수:8664

안녕하세요 V4L를 가지고 머좀 만들어볼려는 학생입니다.
이렇게 처음으로 질문을 드리네요 ^^

EZ-X5보드와 로직텍 퀵캠 4000에 장비를 가지고
V4L로 "file.bmp"란 파일을 생성하는 프로그램을 만들었습니다.
그런데 사진이 이상하게 깨져서 나오더군요.(아마설정을 잘못해준거 같은데...)

QT를 이용한 camstream을 이용하면 영상이 깨끗하게 나옵니다.
밑에는 재가 코딩한 프로그램입니다.

또 한가지만 더 물어볼께요
프레임버퍼로 그림을 출력시키는 방법을 잘모르겠습니다.
인터넷에서 많은 자료를 찻았는데
저의 머리가 돌머리인지 이해가 잘 안되더라고요 -_ㅜ

도와주세요ㅡㅜ

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <getopt.h>
#include <sys/ioctl.h>
                                                                                
#include <semaphore.h>
#include <pthread.h>
#include <stdlib.h>
#include <getopt.h>

#include <linux/types.h>
#include <linux/fb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <sys/mman.h>
#include <linux/videodev.h>

#define SERVO_LEFT        1
#define SERVO_RIGHT        2
#define SERVO_MIDDLE        3

#define Dev_Name        "dev/Cam_Stream_Module"

static int Timer = 0;
static int Servo = 0;
static int frames2 = 0;
static int frame_number = 0;

//extern int frame_number2;

struct picbuf
{
        char *data;
};

typedef struct camera
{
        int dev;
        int x;
        int y;
        int dither;
        int contrast, brightness, colour, hug;
        struct video_capability         vid_cap;
        struct video_picture                vid_pic;
        struct video_channel                vid_chnl;
        struct video_window                vid_win;
        struct video_mbuf                vid_buf;
        struct video_mmap                vid_map[2];
        char video_dev[256];
        char *pic;
        char *image;
        char *ppmfile;
        struct picbuf pic_buf[2];
}cam;

struct bgrpixel
{
        unsigned char b, g , r;
};

typedef struct lcd_frmae_buffer
{
        int dev;
        char lcd_dev[256];
        struct fb_var_screeninfo        fbvar;
        struct bgrpixel                 pixel;
        int x;
        int y;
        int bp;
        int byte_total;
        unsigned short *vbase;
}lcd;

int video_open(lcd *lcd)
{
        if(ioctl(lcd->dev, FBIOGET_VSCREENINFO, &lcd->fbvar) < 0)
        {
                printf("fbvar open failn");
                return 0;
        }
        if(lcd -> fbvar.bits_per_pixel != 16)
        {
                printf("bpp is not 16n");
                exit(0);
        }
        lcd -> x = lcd -> fbvar.xres;
        lcd -> y = lcd -> fbvar.yres;
        lcd -> bp = lcd -> fbvar.bits_per_pixel;
        lcd -> byte_total = (lcd->x * lcd->y * (lcd->bp/8));
        lcd -> vbase = (unsigned short *) mmap(0, lcd->byte_total, PROT_READ | PROT_WRITE, MAP_SHARED, lcd->dev, 0);
        if((unsigned)lcd->vbase == (unsigned)-1)
        {
                printf("Lcd MMAP FAILn");
                exit(0);
        }

        return 0;
}

static unsigned short makepixel(lcd *lcd, unsigned char r, unsigned char g, unsigned char b)
{
        unsigned short rnew, gnew, bnew;
        
        rnew = r >> (8 - (lcd->fbvar.red.length));
        gnew = g >> (8 - (lcd->fbvar.green.length));
        bnew = b >> (8 - (lcd->fbvar.blue.length));
        
        return (unsigned short) ((rnew << lcd->fbvar.red.offset)
                | (gnew << lcd->fbvar.green.offset)
                | (bnew << lcd->fbvar.blue.offset));
}

void screen(lcd *lcd,cam *cam)
{
        int x, y;
        
        for(x = 0; x <= cam->x ; x ++)
        {
                for(y = 0; y <= cam->y ; y++)
                {
                        lcd->pixel.r = 10;
                        lcd->pixel.g = 10;
                        lcd->pixel.b = 10;
                        *(lcd->vbase + x *lcd->fbvar.xres+y) = makepixel(&lcd->fbvar, lcd->pixel.r, lcd->pixel.g, lcd->pixel.b);
                }
        }
}

void draw(int x, int y, unsigned short color,lcd *lcd)
{
        unsigned short *ptr;
        ptr = lcd->vbase + ((y * lcd->x) + x);
        *ptr = color;
}

int ppm_save(cam *cam)
{
        FILE *fp;
        int fc;
        
        printf("Capturing...n");
        fp = fopen(cam->ppmfile, "w");
        if(fp == NULL)
        {
                printf("OPEN FAIL FOR WIRTING...n");
                return -1;
        }
        fprintf(fp, "P6n%d %dn%dn",cam->x,cam->y,255);
        fc = fwrite(cam->pic_buf[frame_number].data, 1, cam->vid_buf.size, fp);
        fclose(fp);
        return 0;
}        

void camera_cap(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCGCAP, &cam->vid_cap) == -1)
        {
                printf("Camera Capabilities OPEN FAIL, EXIT...n");
                exit(0);
        }
        if(cam -> vid_cap.maxwidth < cam -> x)
        {
                cam->x = cam->vid_cap.maxwidth;
        }
        if(cam -> vid_cap.minwidth > cam -> x)
        {
                cam->x = cam->vid_cap.minwidth;
        }
        if(cam -> vid_cap.maxheight < cam -> y)
        {
                cam->y = cam->vid_cap.maxheight;
        }
        if(cam -> vid_cap.minheight > cam -> y)
        {
                cam->y = cam->vid_cap.minheight;
        }
}

void set_pic_info(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCSPICT, &cam->vid_pic) == -1)
        {
                printf("VIDEO PICTURE OPEN FILE EXIT.....n");
                exit(0);        
        }
}

void get_pic_info(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCSPICT, &cam->vid_pic) == -1)
        {
                printf("VIDEO GET PICTURE OPEN FAIL EXIT.....n");
                exit(0);
        }
}

void get_win_info(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCSWIN, &cam->vid_win) == -1)
        {
                printf("VIDEO GET WINDOW OPEN FAIL EXIT.....n");
                exit(0);
        }
}

void set_win_info(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCSWIN, &cam->vid_win) == -1)
        {
                printf("VIDEO SET WINDOW OPEN FAIL EXIT.....n");
                exit(0);
        }
}

void set_buffer(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCGMBUF, &cam->vid_buf) == -1)
        {
                printf("BUFFER SET FAIL EXIT.....n");
                exit(0);
        }
}


void dev_open(void)
{
        Servo = open(Dev_Name, O_RDWR | O_NOCTTY);        
        Timer = open("dev_timer", O_RDWR | O_NOCTTY);
        
        if(Servo < 0)
        {
                printf("%s OPEN FAIL.....n",Dev_Name);
                exit(0);
        }
        printf("Servo OPEN SUCCESS.....n");
        if(Timer < 0)
        {
                printf("Timer OPEN Fail [dev/timer]nn");
                exit(1);
        }
        printf("Timer OPENn");
}

void init_cam(cam *cam)
{
        cam->pic = mmap(0,cam->vid_buf.size,PROT_READ | PROT_WRITE,MAP_SHARED, cam->dev,0);
        cam->vid_map[0].height = cam->y;
        cam->vid_map[0].width = cam->x;
        cam->vid_map[0].frame = 0;
        cam->vid_map[0].format = cam->vid_pic.palette;
        cam->pic_buf[0].data = cam->pic;
        cam->vid_map[1].height = cam->y;
        cam->vid_map[1].width = cam->x;
        cam->vid_map[1].frame = 1;
        cam->vid_map[1].format = cam->vid_pic.palette;
        cam->pic_buf[1].data = cam->pic + cam->vid_buf.offsets[1];
        
        if((unsigned char*) -1 == (unsigned char *) cam->pic)
        {
                printf("MMAP FAILEDn");
                exit(-1);
        }
        if(ioctl(cam->dev, VIDIOCMCAPTURE, cam->vid_map) == -1)
        {
                printf("100n");
        }
        if(ioctl(cam->dev, VIDIOCSYNC, cam->vid_map) == -1)
        {
                printf("1000n");
        }
}

void frameloop(cam *cam)
{
        int ctl = 0;
        ctl = ioctl(cam->dev, VIDIOCMCAPTURE, cam->vid_map + frame_number);

        if(ctl == -1)
        {
                printf("CAPTURE FROM DEVICE OPEN FAIL.....n");
                exit(-1);
        }
        frames2++;
        ctl = ioctl(cam->dev, VIDIOCSYNC, cam->vid_map + frame_number);

        if(ctl == -1)
        {
                printf("VIDIOCSYNC FAILED.....n");
                munmap(cam->vid_map, cam->vid_buf.size);
                exit(-1);
        }
}

int main(int argc,char **argv)
{
        //int one = 1;
        //int done = 0;
        
        cam cam;
        lcd lcd;
        
        cam.x = 320;
        cam.y = 240;

        strcpy(lcd.lcd_dev, "/dev/fb0");
        strcpy(cam.video_dev, "/dev/video0");

        cam.dither = 128;
        
        lcd.dev = open(lcd.lcd_dev, O_RDWR);
        cam.dev = open(cam.video_dev, O_RDWR);
        
        cam.image = malloc(cam.x * cam.y * 3);
//        cam.vid_buf.size = cam.x * cam.y * 3;

        video_open(&lcd);
        camera_cap(&cam);

        if(ioctl(cam.dev, VIDIOCSCHAN, cam.vid_chnl) == -1);

        cam.vid_pic.palette = VIDEO_PALETTE_RGB24;
        cam.vid_win.x = 0;
        cam.vid_win.y = 0;
        cam.vid_win.width = cam.x;
        cam.vid_win.height = cam.y;

        cam.ppmfile = "file.bmp";
                
        set_pic_info(&cam);

        cam.contrast = cam.vid_pic.contrast * 256;
        cam.brightness = cam.vid_pic.brightness * 256;
        cam.colour = cam.vid_pic.colour * 256;
        cam.hug = cam.vid_pic.hue * 256;

        set_win_info(&cam);
        
        set_buffer(&cam);
        init_cam(&cam);
        //dev_open();

        while(1)
        {
                frameloop(&cam);
                ppm_save(&cam);
        }
        return 0;
}
이 게시물을
  • Twitter
  • Facebook
  • Delicious
목록

댓글 0

목록
번호 제목 글쓴이 날짜 조회 수
공지 포럼의 메뉴가 보이지 않아요! 장길석 2014.02.06 957631
공지 [중요 공지]제품 사용 및 기술 문의는 전화 상담을 받지 않습니다. 장길석 2012.11.09 1408526
공지 답글에 대한 공지 사항. falinux 2006.11.20 2424020
10801 [특판][성Y인Y용Y품][비아][시알][여성흥분제] 전부 1+1 vv8282.top 지금 확인해보세요~! dde33 2026.10.15 2
10800 요즘 잘 나가는,,, dde33 2026.09.12 843
10799 buildroot 사용 관련 로즈마리 2021.02.01 38166
10798 GPIO 제어 방법 문의 [1] 단순최고 2021.01.25 51084
10797 임베디드 리눅스 개발 보드 추천 nam 2019.12.06 48863
10796 make wandboard_quad 실행시 문제 gasi 2019.08.27 47084
10795 LCD 초기화 코드 좀 봐주세요 [1] 김용수 2019.07.12 63134
10794 임베디드 리눅스 커널 소스에 관해 질문드립니다 ! ekthatkxkd 2019.06.28 43727
10793 numpy,scipy 를 arm-linux-XXXX 로 크로스컴파일 하여 올릴수 있나요? 초보자 2019.06.24 49287
10792 I2C - deal with arbitration loss 오류가 궁금합니다. [1] S1eepingBeauty 2018.12.10 56770
10791 구형 EM-PXA270 보드 혹시 보유하시분 연락 주시면 감사드릴께요. file 존 2018.11.24 42753
10790 리눅스 GPIO 관련 센서의 단선 또는 고장유무 판별법이 궁금합니다. [2] S1eepingBeauty 2018.11.12 55125
10789 임베디드 리눅스에서 c 언어 디버깅 궁금합니다. [1] 존 2018.09.14 47072
10788 부팅 시간 문의 [1] nam 2018.06.29 45791
10787 fork()의 thread 멈추는 현상 [4] HwangRoy 2018.05.09 58614
10786 실행중 symbol not found 를 발생시키는 u-boot 본적 있으신가요 ? sayyouandme 2017.12.17 57347
10785 NOR Flash 질문! [1] Chanmini 2017.12.11 67068
10784 소스 해석 도와주세요 ... 남바완 2017.10.31 55610
10783 리눅스 드라이버 IRS에 관한 질문드립니다 [1] 김현수 2017.05.07 32388
10782 N200-S5PV210에 리눅스 커널 4.4.52 부팅이 안되네요.. 도와주세요.. [1] 성정기 2017.03.14 29209
첫 페이지 1 2 3 4 5 6 7 8 9 10 끝 페이지
쓰기
태그
부탁드립니다. ^^
  • 글을 작성하시려면 회원으로 가입하시고 로그인 하셔야 합니다.
  • 회원 가입은 주민등록번호가 필요 없으며, 메일 주소만 있으면 간단하게 가입하실 수 있습니다.
  • 본 포럼에 등록된 모든 글의 저작권은 작성하신 분께 있으며, 저작자의 허락 없이 다른 곳에 펌이나 도용하시면 안 됩니다.
  • 또한, 전자우편 수집 프로그램이나 그 밖의 기술적 장치를 이용하여 무단으로 이메일 주소 및 자료 수집되는 것을 거부하며,
  • 이를 위반 시 정보통신망 법에 의해 형사 처벌됨을 유념하시기 바랍니다.
  • FF 포럼
  • 강좌 & 팁
  • 함수설명
  • 자료실
  • 도와주세요