最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言調用攝像頭實現(xiàn)生成yuv未壓縮圖片

 更新時間:2023年11月17日 16:27:47   作者:樂山勁松  
這篇文章主要為大家詳細介紹了C語言如何調用攝像頭實現(xiàn)生成yuv未壓縮圖片,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以參考一下

播發(fā)yuv格式圖片:ffplay -f rawvideo -video_size 1920X1080 -pixel_format  yuyv422  my.yuv

此圖片是沒有進行過任何壓縮處理的圖片,是攝像頭最高分辨率的圖片。

實現(xiàn)代碼

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>  //v4l2 頭文件
#include <string.h>
#include <sys/mman.h>
int main(void)
{
	//1.打開設備
	int fd = open("/dev/video0", O_RDWR);
	if(fd < 0)
	{
		perror("打開設備失敗");
		return -1;
	}
	//設置采集格式	
	struct v4l2_format {
		enum v4l2_buf_type {
			V4L2_BUF_TYPE_VIDEO_CAPTURE        = 1,
			V4L2_BUF_TYPE_VIDEO_OUTPUT         = 2,
			V4L2_BUF_TYPE_VIDEO_OVERLAY        = 3,
		}type;
		union {
			//	struct v4l2_pix_format         pix;     /* V4L2_BUF_TYPE_VIDEO_CAPTURE */
			struct v4l2_window             win;     /* V4L2_BUF_TYPE_VIDEO_OVERLAY */
			struct v4l2_vbi_format         vbi;     /* V4L2_BUF_TYPE_VBI_CAPTURE */
			struct v4l2_sliced_vbi_format  sliced;  /* V4L2_BUF_TYPE_SLICED_VBI_CAPTURE */
			__u8   raw_data[200];                   /* user-defined */
			struct v4l2_pix_format {
				__u32			width;
				__u32			height;
				__u32			pixelformat;
				__u32			field;		/* enum v4l2_field */
				__u32			bytesperline;	/* for padding, zero if unused */
				__u32			sizeimage;
				__u32			colorspace;	/* enum v4l2_colorspace */
				__u32			priv;		/* private data, depends on pixelformat */
				__u32			flags;		/* format flags (V4L2_PIX_FMT_FLAG_*) */
				union {
					/* enum v4l2_ycbcr_encoding */
					__u32			ycbcr_enc;
					/* enum v4l2_hsv_encoding */
					__u32			hsv_enc;
				};
				__u32			quantization;	/* enum v4l2_quantization */
				__u32			xfer_func;	/* enum v4l2_xfer_func */
			}pix;
		} fmt;
	}vfmt;
	vfmt.type=1;	
	vfmt.fmt.pix.width=1920;         //720p=1280*720  1080p=1920*1080
	vfmt.fmt.pix.pixelformat=v4l2_fourcc('Y','U','Y','V');         //生成不壓縮的圖片
	                                                              //播發(fā)yuv格式圖片:ffplay -f rawvideo -video_size 1920X1080 -pixel_format  yuyv422  my.yuv
	int ret = ioctl(fd, VIDIOC_S_FMT, &vfmt);
	if(ret < 0)
	{
		perror("設置格式失敗");
	}
	//4.申請內核緩沖區(qū)個數(shù)
	struct v4l2_requestbuffers {
		__u32			count;     //申請個數(shù)
		__u32			type;		/* enum v4l2_buf_type */
		__u32			memory;		/* enum v4l2_memory */
		__u32			capabilities;
		__u32			reserved[1];
	}reqbuffer;
	reqbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	reqbuffer.count = 1; //申請4個緩沖區(qū)
	reqbuffer.memory=V4L2_BUF_CAP_SUPPORTS_MMAP;      //映射方式
	ret  = ioctl(fd, VIDIOC_REQBUFS, &reqbuffer);
	if(ret < 0)
	{
		perror("申請隊列空間失敗");
	}
	//設置 設備映射到內存的選項
	struct v4l2_buffer {
		__u32			index;
		__u32			type;
		__u32			bytesused;
		__u32			flags;
		__u32			field;
		struct timeval		timestamp;
		struct v4l2_timecode	timecode;
		__u32			sequence;
		/* memory location */
		__u32			memory;
		union {
			__u32           offset;
			unsigned long   userptr;
			struct v4l2_plane *planes;
			__s32		fd;
		} m;
		__u32			length;
		__u32			reserved2;
		union {
			__s32		request_fd;
			__u32		reserved;
		};
	}mapbuffer;
	unsigned char *mptr;
	unsigned int  size;
	mapbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	mapbuffer.index = 0;
	ret = ioctl(fd, VIDIOC_QUERYBUF, &mapbuffer);//查詢緩沖區(qū)狀態(tài)
	if(ret < 0)
	{
		perror("查詢內核空間隊列失敗");
	}
	int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	ret = ioctl(fd, VIDIOC_STREAMON, &type);     //啟動流
	if(ret < 0)
	{
		perror("開啟失敗");
	}
	mptr= (unsigned char *)mmap(NULL, mapbuffer.length, PROT_READ|PROT_WRITE, 
		MAP_SHARED, fd, mapbuffer.m.offset);       //設備映射到緩沖區(qū)內存
	size=mapbuffer.length;
	ret  = ioctl(fd, VIDIOC_QBUF, &mapbuffer);    //把緩沖區(qū)數(shù)據放入讀隊列中
	if(ret < 0)                                   
	{
		perror("放回失敗");
	}
	ret = ioctl(fd, VIDIOC_DQBUF, &mapbuffer);       //讀當前隊列緩沖區(qū)的數(shù)據
	if(ret < 0)
	{
		perror("提取數(shù)據失敗");
	}
	FILE *file=fopen("my.yuv", "w+");
	fwrite(mptr,mapbuffer.length, 1, file);
	fclose(file);
	munmap(mptr, size);
	close(fd);
	return 0;
}

到此這篇關于C語言調用攝像頭實現(xiàn)生成yuv未壓縮圖片的文章就介紹到這了,更多相關C語言生成yuv圖片內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺析C/C++變量在內存中的分布

    淺析C/C++變量在內存中的分布

    變量在內存地址的分布為:堆-棧-代碼區(qū)-全局靜態(tài)-常量數(shù)據。同一區(qū)域的各變量按聲明的順序在內存的中依次由低到高分配空間(只有未賦值的全局變量是個例外)
    2013-09-09
  • C語言函數(shù)基礎教程分類自定義參數(shù)及調用示例詳解

    C語言函數(shù)基礎教程分類自定義參數(shù)及調用示例詳解

    這篇文章主要為大家介紹了C語言函數(shù)的基礎教程,主要包含C語言函數(shù)的分類,C語言函數(shù)自定義,C語言函數(shù)的參數(shù)及C語言函數(shù)的調用示例詳解,有需要的朋友可以借鑒參考下
    2021-11-11
  • C語言新建臨時文件和臨時文件名的方法

    C語言新建臨時文件和臨時文件名的方法

    這篇文章主要介紹了C語言新建臨時文件和臨時文件名的方法,分別是mkstemp()函數(shù)和mktemp()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C語言指針類型與野指針引起的原因

    C語言指針類型與野指針引起的原因

    我們C語言獨一無二的特色——指針。說起指針,可能很多人都是還沒學就已經聽說過其鼎鼎大名,因為有很多傳言和玩笑什么的說指針很難,其實大家大可不必有畏難情緒,指針這個東西雖然確實有一定難度,但是這是基于其優(yōu)秀的靈活性而衍生的一點小問題
    2023-02-02
  • C++棧溢出實戰(zhàn)案例解析

    C++棧溢出實戰(zhàn)案例解析

    棧溢出是C++中常見的“隱形殺手”,由于棧內存有限,可能會導致程序崩潰,理解棧的工作原理和有限性,以及掌握相應的解決方案,是避免棧溢出的關鍵,本文給大家介紹C++棧溢出實戰(zhàn)案例解析,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • 一起來學習C++中類的this指針以使用

    一起來學習C++中類的this指針以使用

    這篇文章主要為大家詳細介紹了C++中類的this指針以使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • VC通過托盤圖標得到該所屬進程的實現(xiàn)代碼

    VC通過托盤圖標得到該所屬進程的實現(xiàn)代碼

    這篇文章主要介紹了VC通過托盤圖標得到該所屬進程的實現(xiàn)代碼,為了方便大家使用特將多個代碼分享給大家,需要的朋友可以參考下
    2021-10-10
  • C++中的模板類&模板函數(shù)

    C++中的模板類&模板函數(shù)

    這篇文章主要介紹了C++中的模板類&模板函數(shù)用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言實現(xiàn)定時器控制LED燈閃爍

    C語言實現(xiàn)定時器控制LED燈閃爍

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)定時器控制LED燈閃爍,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++編程中使用設計模式中的policy策略模式的實例講解

    C++編程中使用設計模式中的policy策略模式的實例講解

    這篇文章主要介紹了C++編程中使用設計模式中的policy策略模式的實例講解,文章最后對策略模式的優(yōu)缺點有一個簡單的總結,需要的朋友可以參考下
    2016-03-03

最新評論

泰兴市| 台湾省| 进贤县| 江西省| 焉耆| 桓仁| 平山县| 河南省| 甘南县| 山阴县| 丘北县| 应用必备| 吴桥县| 长寿区| 吉隆县| 淮阳县| 鲁甸县| 贵德县| 屯昌县| 巢湖市| 东丰县| 定边县| 河间市| 南澳县| 湘潭市| 南昌市| 吉木萨尔县| 秭归县| 牙克石市| 固原市| 嵊州市| 洛南县| 南靖县| 柳河县| 美姑县| 石柱| 新河县| 万年县| 和静县| 抚松县| 柳州市|