在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++网络编程 → 捕捉摄像头数据显示

捕捉摄像头数据显示

C/C++网络编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:6.49KB
  • 下载次数:22
  • 浏览次数:293
  • 发布时间:2016-01-20
  • 实例类别:C/C++网络编程
  • 发 布 人:man_you
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 摄像头

实例介绍

【实例简介】
【实例截图】

【核心代码】

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>

#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <errno.h>
#include <asm/types.h>
#include <linux/videodev2.h>

#include "videocapture.h"
#include "yuv2rgb.h"

#define WIDTH  640
#define HEIGHT  480
#define BUFFER_NUM 1


VideoBuffer *buffers;
v4l2_std_id std;
struct v4l2_requestbuffers reqbuf;
struct v4l2_buffer buf;
enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
struct v4l2_control reg;
unsigned char rgbBuffer[WIDTH * HEIGHT * 3];
int fd;

int openDevice()
{
	fd = open("/dev/video0", O_RDWR);
	if (fd < 0) {
			printf("== open device error ==\n");
//			exit(-1);
            return -1;
	}

	memset(&std, 0, sizeof(std));
	int ret;
	do {
		ret = ioctl(fd, VIDIOC_QUERYSTD, &std);
		printf("== std %d ==\n", ret);
	} while (ret == -1 && errno == EAGAIN);
	
        printf("== std: %x ==\n", (unsigned int)std);
	switch(std) {
	case V4L2_STD_NTSC:
		printf("== std : NTSC ==\n");	
		break;
	case V4L2_STD_PAL:
		printf("== std : PAL ==\n");	
		break;
	case V4L2_STD_PAL_D:
		printf("== std : PAL_D ==\n");	
		break;
	default:
		printf("== std : other %d==\n", ret);	
		break;
	}

	struct v4l2_capability capa;
	ret = ioctl(fd, VIDIOC_QUERYCAP, &capa);
	if (ret < 0) {
		printf("== get capability failed ==\n");
	}

	if (! (capa.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
		printf("== do not support capture ==\n");
	} 

	if (! (capa.capabilities & V4L2_CAP_STREAMING)) {
		printf("== do not support streaming ==\n");
	}

	struct v4l2_format fmt;
	memset(&fmt, 0, sizeof(fmt)); 
	fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
	fmt.fmt.pix.width = WIDTH;
	fmt.fmt.pix.height = HEIGHT;
	fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
	fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
	fmt.fmt.pix.bytesperline = WIDTH  * 2 ;
	fmt.fmt.pix.sizeimage = WIDTH * HEIGHT * 2;
	ret = ioctl(fd, VIDIOC_S_FMT, &fmt);
	if (ret < 0) {
		printf("======set format failed %d========\n", errno);
	}

	reqbuf.count = BUFFER_NUM;
	reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	reqbuf.memory = V4L2_MEMORY_MMAP;

	ret = ioctl(fd, VIDIOC_REQBUFS, &reqbuf);
	if (ret == EINVAL) {
		printf("== do not support mmap==\n");
	}
	if (ret < 0) {
		printf("== reqbufs buffers failed %d ==\n", errno);
		return ret;
	}

	buffers = calloc(reqbuf.count, sizeof(*buffers));

	memset(rgbBuffer, 0, sizeof(rgbBuffer));

	int i;
	for (i = 0; i < reqbuf.count; i  ) {
		memset(&buf, 0, sizeof(buf));
		buf.index = i;
		buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		buf.memory = V4L2_MEMORY_MMAP;
		
		ret = ioctl(fd, VIDIOC_QUERYBUF, &buf);
		if (ret < 0) {
			printf("== query buffer failed ==\n");
			return ret;
		}
		
		buffers[i].length = buf.length;
		buffers[i].start = (char *) mmap(NULL, buf.length, PROT_READ | PROT_WRITE,
						MAP_SHARED, fd, buf.m.offset);
		if (buffers[i].start == MAP_FAILED) {
			printf("== mmap %d failed: %d ==\n", i, strerror(errno));
			return -1;
		}

		ret = ioctl(fd, VIDIOC_QBUF, &buf);
		if (ret < 0) {
			printf("== QBUF %d failed: %d ==\n", i, strerror(errno));
			return -1;
		}
	//	printf("== buffer %d  addr: 0x%x, length: %d== \n", i, (unsigned int)buffers[i].start, buffers[i].length);
	}
	//printf("== mmap done %d == \n", i);

	ret = ioctl(fd, VIDIOC_STREAMON, &type);
	if (ret < 0) {
		printf("== STREAMON failed == \n");
		return ret;
	}

	return fd;
}
int startCapture(unsigned char *distBuffer)
{

	int ret;
//	static int counter = 0;
//        while (1)  {
		ret = ioctl(fd, VIDIOC_DQBUF, &buf);
//		if (ret < 0) {
//			printf("== DQBUF failed == \n");
//			return ret;
//		}

//		if (counter   > 10)
//				return 0;

//                convertYUV2RGB(buffers[buf.index].start, distBuffer, WIDTH, HEIGHT);
                yuyv_bgr32(WIDTH, HEIGHT, buffers[buf.index].start, distBuffer );
	
//		printf("frame %d\n", counter);
		ret = ioctl(fd, VIDIOC_QBUF, &buf);
		if (ret < 0) {
			printf("== QBUF failed ==\n");
			return ret;
		}
//        }
                return 0;
}

int startCapture_YUV_TO_RGB(const unsigned char *srcBuffer, unsigned char *distBuffer)
{

	int ret;



                yuyv_bgr32(WIDTH, HEIGHT, srcBuffer, distBuffer );
	



                return 0;
}

int stopCapture()
{
    return 0;
}

int closeDevice()
{
	int ret, i;
	for (i = 0; i < BUFFER_NUM; i  ) {
		munmap(buffers[i].start, buffers[i].length);
	}

	ret = ioctl(fd, VIDIOC_STREAMOFF, &type);
	if (ret < 0) {
		printf("== Stream off failed ==\n");
		return ret;
	}
	return close(fd);
}

int setRegister(unsigned id, signed value)
{
    printf("-- set register --");
    int ret;
    reg.id =(unsigned) id;
    reg.value = (signed) value;
    ret = ioctl(fd, VIDIOC_S_CTRL, &reg);
    if (ret < 0) {
            printf("== set register failed %d ==\n", errno);
            return ret;
    }
    return 0;
}

标签: 摄像头

实例下载地址

捕捉摄像头数据显示

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警