国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux攝像頭(v4l2應(yīng)用)——獲取攝像頭一幀圖像

這篇具有很好參考價(jià)值的文章主要介紹了Linux攝像頭(v4l2應(yīng)用)——獲取攝像頭一幀圖像。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一.V4L2簡(jiǎn)介

V4L2(Video for Linux 2):Linux內(nèi)核中視頻設(shè)備中的驅(qū)動(dòng)框架,對(duì)于應(yīng)用層它提供了一系列的API接口,同時(shí)對(duì)于硬件層,它適配大部分的視頻設(shè)備,因此通過(guò)調(diào)用V4L2的接口函數(shù)可以適配大部分的視頻設(shè)備。

二、操作流程

1.打開設(shè)備

當(dāng)把攝像頭插入到電腦后,執(zhí)行l(wèi)s /dev/vi* 可看到/dev目錄下出現(xiàn)攝像頭的video節(jié)點(diǎn)。這里出現(xiàn)了兩個(gè)設(shè)備節(jié)點(diǎn):dev/video0、dev/video1,是因?yàn)橐粋€(gè)是圖像/視頻采集,一個(gè)是metadata采集。

v4l2攝像頭采集,linux,學(xué)習(xí),筆記

使用open函數(shù)打開攝像頭節(jié)點(diǎn)

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char**argv)
{
	if(argc != 2)
	{
		printf("%s </dev/video0,1...>\n", argv[0]);
		return -1;
	}
	int fd = open(argv[1], O_RDWR);
	if(fd < 0)
	{
		perror("打開設(shè)備失敗");
		return -1;
	}

	close(fd);
	return 0;
}
2.獲取支持格式和功能

使用ioctl函數(shù)int ioctl(int fd, unsigned long request, ...)獲取攝像頭支持的格式,這里ioctl的參數(shù)可以在頭文件videodev2.h中找到(路徑為/usr/include/linux/)。對(duì)應(yīng)操作命令如下表,這里需要獲取攝像頭支持的格式,所以操作命令為VIDIOC_ENUM_FMT,對(duì)應(yīng)的結(jié)構(gòu)體是struct v4l2_fmtdesc。另建議在source insight下下載linux源碼,然后建立該工程,在該工程下寫代碼,便于查看對(duì)應(yīng)結(jié)構(gòu)體。

v4l2攝像頭采集,linux,學(xué)習(xí),筆記v4l2攝像頭采集,linux,學(xué)習(xí),筆記

關(guān)于v4l2_fmtdesc結(jié)構(gòu)體
struct v4l2_fmtdesc {
	__u32		    index;             /* Format number      */
	__u32		    type;              /* enum v4l2_buf_type */
	__u32               flags;
	__u8		    description[32];   /* Description string */
	__u32		    pixelformat;       /* Format fourcc      */
	__u32		    reserved[4];
};

?該結(jié)構(gòu)體定義如上,因?yàn)関4l2不單單針對(duì)攝像頭,所以在使用前需要對(duì)type成員進(jìn)行初始化,v4l2_buf_type這個(gè)枚舉總共有13個(gè)成員,這里選擇1,即視頻抓取。

v4l2攝像頭采集,linux,學(xué)習(xí),筆記

在用代碼讀取過(guò)程中時(shí),因?yàn)橹С侄喾N格式,所以用while循環(huán)讀取支持的格式,

關(guān)于v4l2_capability結(jié)構(gòu)體
struct v4l2_capability
{
	u8 driver[16]; // 驅(qū)動(dòng)名字
	u8 card[32]; // 設(shè)備名字
	u8 bus_info[32]; // 設(shè)備在系統(tǒng)中的位置
	u32 version;// 驅(qū)動(dòng)版本號(hào)
	u32 capabilities;// 設(shè)備支持的操作
	u32 reserved[4]; // 保留字段
};

除了用?v4l2_fmtdesc結(jié)構(gòu)體獲取像素格式,還可以通過(guò)v4l2_capability結(jié)構(gòu)體來(lái)獲取設(shè)備的功能,主要看capabilities成員,其是否支持視頻捕獲(V4L2_CAP_VIDEO_CAPTURE)、以及是否支持流讀寫(V4L2_CAP_STREAMING)。

#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>
int main(int argc, char**argv)
{
	if(argc != 2)
	{
		printf("%s </dev/video0,1...>\n", argv[0]);
		return -1;
	}
	//打開攝像頭設(shè)備
	int fd = open(argv[1], O_RDWR);
	if(fd < 0)
	{
		perror("打開設(shè)備失敗");
		return -1;
	}
	//獲取攝像頭支持格式,使用ioctl函數(shù)int ioctl(int fd, unsigned long request, ...);
	struct v4l2_fmtdesc v4fmt;
	struct v4l2_capability cap;
	v4fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;	//選擇視頻抓取
	int i = 0;
	while(1)
	{
		v4fmt.index = i;
		i++;
		int ret = ioctl(fd, VIDIOC_ENUM_FMT, &v4fmt);
		if(ret < 0)
		{
			perror("獲取格式失敗");
			break;
		}
		printf("index = %d\n", v4fmt.index);
		printf("flags = %d\n", v4fmt.flags);
		printf("descrrption = %s\n", v4fmt.description);
		unsigned char *p = (unsigned char*)&v4fmt.pixelformat;
		printf("pixelformat = %c%c%c%c\n", p[0],p[1],p[2],p[3]);
		printf("reserved = %d\n", v4fmt.reserved[0]);
	}

	int ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);
	if(ret < 0)
		perror("獲取功能失敗");
	
	printf("drivers:%s\n", cap.driver);//讀取驅(qū)動(dòng)名字
	if(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)
		printf("%s 支持視頻捕獲\n", argv[1]);
	if(cap.capabilities & V4L2_CAP_STREAMING)
		printf("%s 支持流讀寫\n", argv[1]);
	close(fd);
	return 0;
	
}

運(yùn)行結(jié)果

v4l2攝像頭采集,linux,學(xué)習(xí),筆記

運(yùn)行結(jié)果說(shuō)明我的攝像頭支持視頻捕獲,同時(shí)支持流讀寫支持兩種像素格式Y(jié)UYV和MJPG,讀不到video1支持的像素格式,該攝像頭的兩個(gè)設(shè)備節(jié)點(diǎn)僅video0用于視頻采集。關(guān)于YUYV和MJPG可以看這篇博文。

https://blog.csdn.net/u014260892/article/details/51883723

3.配置攝像頭

在視頻采集之前需要設(shè)置視頻采集格式,定義v4l2_format結(jié)構(gòu)體變量,然后通過(guò)結(jié)構(gòu)體v4l2_pix_format來(lái)設(shè)置采集的高、寬以及像素格式(YUYV),設(shè)置之后,可以采用打印的方式來(lái)查看是否設(shè)置成功。

struct v4l2_format {
	__u32	 type;
	union {
		struct v4l2_pix_format		pix;     /* V4L2_BUF_TYPE_VIDEO_CAPTURE */
		struct v4l2_pix_format_mplane	pix_mp;  /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */
		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 */
		struct v4l2_sdr_format		sdr;     /* V4L2_BUF_TYPE_SDR_CAPTURE */
		__u8	raw_data[200];                   /* user-defined */
	} fmt;
};

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_*) */
	__u32			ycbcr_enc;	/* enum v4l2_ycbcr_encoding */
	__u32			quantization;	/* enum v4l2_quantization */
	__u32			xfer_func;	/* enum v4l2_xfer_func */
};

測(cè)試程序如下:

#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>
int main(int argc, char**argv)
{
	if(argc != 2)
	{
		printf("%s </dev/video0,1...>\n", argv[0]);
		return -1;
	}
	//打開攝像頭設(shè)備
	int fd = open(argv[1], O_RDWR);
	if(fd < 0)
	{
		perror("打開設(shè)備失敗");
		return -1;
	}
	//設(shè)置攝像頭采集格式
	struct v4l2_format vfmt;
	vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;	//選擇視頻抓取
	vfmt.fmt.pix.width = 640;//設(shè)置寬,不能隨意設(shè)置
	vfmt.fmt.pix.height = 480;//設(shè)置高
	vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;//設(shè)置視頻采集格式

	int ret = ioctl(fd, VIDIOC_S_FMT, &vfmt);// VIDIOC_S_FMT:設(shè)置捕獲格式
	if(ret < 0)
	{
		perror("設(shè)置采集格式錯(cuò)誤");
	}

	memset(&vfmt, 0, sizeof(vfmt));
	vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	ret = ioctl(fd, VIDIOC_G_FMT, &vfmt);	
	if(ret < 0)
	{
		perror("讀取采集格式失敗");
	}
	printf("width = %d\n", vfmt.fmt.pix.width);
	printf("width = %d\n", vfmt.fmt.pix.height);
	unsigned char *p = (unsigned char*)&vfmt.fmt.pix.pixelformat;
	printf("pixelformat = %c%c%c%c\n", p[0],p[1],p[2],p[3]);	
	close(fd);
	return 0;
	
}

?運(yùn)行結(jié)果和設(shè)置一樣

v4l2攝像頭采集,linux,學(xué)習(xí),筆記

4.向內(nèi)核申請(qǐng)幀緩沖隊(duì)列并映射

V4L2讀取數(shù)據(jù)時(shí)有兩種方式,第一種是用read讀取(調(diào)用read函數(shù)),第二種是用流(streaming)讀取,在第二步上已經(jīng)獲取到我的設(shè)備支持流讀寫,為了提高效率采用流讀寫,流讀寫就是在內(nèi)核中維護(hù)一個(gè)緩存隊(duì)列,然后再映射到用戶空間,應(yīng)用層直接讀取隊(duì)列中的數(shù)據(jù)。

步驟為:申請(qǐng)緩沖區(qū)->逐個(gè)查詢申請(qǐng)到的緩沖區(qū)->逐個(gè)映射->逐個(gè)放入隊(duì)列中

#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>
#include <string.h>
#include <sys/mman.h>
int main(int argc, char**argv)
{
	if(argc != 2)
	{
		printf("%s </dev/video0,1...>\n", argv[0]);
		return -1;
	}
	//打開攝像頭設(shè)備
	int fd = open(argv[1], O_RDWR);
	if(fd < 0)
	{
		perror("打開設(shè)備失敗");
		return -1;
	}
	//設(shè)置攝像頭采集格式
	struct v4l2_format vfmt;
	vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;	//選擇視頻抓取
	vfmt.fmt.pix.width = 640;//設(shè)置寬,不能隨意設(shè)置
	vfmt.fmt.pix.height = 480;//設(shè)置高
	vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;//設(shè)置視頻采集格式

	int ret = ioctl(fd, VIDIOC_S_FMT, &vfmt);// VIDIOC_S_FMT:設(shè)置捕獲格式
	if(ret < 0)
	{
		perror("設(shè)置采集格式錯(cuò)誤");
	}

	memset(&vfmt, 0, sizeof(vfmt));
	vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	ret = ioctl(fd, VIDIOC_G_FMT, &vfmt);	
	if(ret < 0)
	{
		perror("讀取采集格式失敗");
	}
	printf("width = %d\n", vfmt.fmt.pix.width);
	printf("width = %d\n", vfmt.fmt.pix.height);
	unsigned char *p = (unsigned char*)&vfmt.fmt.pix.pixelformat;
	printf("pixelformat = %c%c%c%c\n", p[0],p[1],p[2],p[3]);	

	//申請(qǐng)緩沖隊(duì)列
	struct v4l2_requestbuffers reqbuffer;
	reqbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	reqbuffer.count = 4;	//申請(qǐng)4個(gè)緩沖區(qū)
	reqbuffer.memory = V4L2_MEMORY_MMAP;	//采用內(nèi)存映射的方式

	ret = ioctl(fd, VIDIOC_REQBUFS, &reqbuffer);
	if(ret < 0)
	{
		perror("申請(qǐng)緩沖隊(duì)列失敗");
	}
	
	//映射,映射之前需要查詢緩存信息->每個(gè)緩沖區(qū)逐個(gè)映射->將緩沖區(qū)放入隊(duì)列
	struct v4l2_buffer mapbuffer;
	unsigned char *mmpaddr[4];//用于存儲(chǔ)映射后的首地址
	mapbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;//初始化type
	for(int i = 0; i < 4; i++)
	{
		mapbuffer.index = i;
		ret = ioctl(fd, VIDIOC_QUERYBUF, &mapbuffer);	//查詢緩存信息
		if(ret < 0)
			perror("查詢緩存隊(duì)列失敗");
		mmpaddr[i] = (unsigned char *)mmap(NULL, mapbuffer.length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, mapbuffer.m.offset);//mapbuffer.m.offset映射文件的偏移量
		//放入隊(duì)列
		ret = ioctl(fd, VIDIOC_QBUF, &mapbuffer);
		if(ret < 0)
			perror("放入隊(duì)列失敗");
	}
	close(fd);
	return 0;
	
}
5.采集視頻

做完前面的設(shè)置就可以進(jìn)行采集數(shù)據(jù),打開設(shè)備->讀取數(shù)據(jù)->關(guān)閉設(shè)備->釋放映射。

讀取數(shù)據(jù)的本質(zhì)就是從上一個(gè)步驟中映射的隊(duì)列中取出數(shù)據(jù),取出數(shù)據(jù)后需要將該緩沖區(qū)放入隊(duì)列中,以便于再去采集下一幀數(shù)據(jù)。

為了便于查看,在設(shè)置采集格式時(shí),選擇MJPEG格式,用fopen函數(shù)建立一個(gè)1.jpg文件,用fwrite函數(shù)保存讀到的一幀數(shù)據(jù)。

#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>
#include <string.h>
#include <sys/mman.h>
int main(int argc, char**argv)
{
	if(argc != 2)
	{
		printf("%s </dev/video0,1...>\n", argv[0]);
		return -1;
	}
	//1.打開攝像頭設(shè)備
	int fd = open(argv[1], O_RDWR);
	if(fd < 0)
	{
		perror("打開設(shè)備失敗");
		return -1;
	}
	//2.設(shè)置攝像頭采集格式
	struct v4l2_format vfmt;
	vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;	//選擇視頻抓取
	vfmt.fmt.pix.width = 640;//設(shè)置寬,不能隨意設(shè)置
	vfmt.fmt.pix.height = 480;//設(shè)置高
	vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;//設(shè)置視頻采集像素格式

	int ret = ioctl(fd, VIDIOC_S_FMT, &vfmt);// VIDIOC_S_FMT:設(shè)置捕獲格式
	if(ret < 0)
	{
		perror("設(shè)置采集格式錯(cuò)誤");
	}

	memset(&vfmt, 0, sizeof(vfmt));
	vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	ret = ioctl(fd, VIDIOC_G_FMT, &vfmt);	
	if(ret < 0)
	{
		perror("讀取采集格式失敗");
	}
	printf("width = %d\n", vfmt.fmt.pix.width);
	printf("width = %d\n", vfmt.fmt.pix.height);
	unsigned char *p = (unsigned char*)&vfmt.fmt.pix.pixelformat;
	printf("pixelformat = %c%c%c%c\n", p[0],p[1],p[2],p[3]);	

	//4.申請(qǐng)緩沖隊(duì)列
	struct v4l2_requestbuffers reqbuffer;
	reqbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	reqbuffer.count = 4;	//申請(qǐng)4個(gè)緩沖區(qū)
	reqbuffer.memory = V4L2_MEMORY_MMAP;	//采用內(nèi)存映射的方式

	ret = ioctl(fd, VIDIOC_REQBUFS, &reqbuffer);
	if(ret < 0)
	{
		perror("申請(qǐng)緩沖隊(duì)列失敗");
	}
	
	//映射,映射之前需要查詢緩存信息->每個(gè)緩沖區(qū)逐個(gè)映射->將緩沖區(qū)放入隊(duì)列
	struct v4l2_buffer mapbuffer;
	unsigned char *mmpaddr[4];//用于存儲(chǔ)映射后的首地址
	unsigned int addr_length[4];//存儲(chǔ)映射后空間的大小
	mapbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;//初始化type
	for(int i = 0; i < 4; i++)
	{
		mapbuffer.index = i;
		ret = ioctl(fd, VIDIOC_QUERYBUF, &mapbuffer);	//查詢緩存信息
		if(ret < 0)
			perror("查詢緩存隊(duì)列失敗");
		mmpaddr[i] = (unsigned char *)mmap(NULL, mapbuffer.length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, mapbuffer.m.offset);//mapbuffer.m.offset映射文件的偏移量
		addr_length[i] = mapbuffer.length;
		//放入隊(duì)列
		ret = ioctl(fd, VIDIOC_QBUF, &mapbuffer);
		if(ret < 0)
			perror("放入隊(duì)列失敗");
	}

	//打開設(shè)備
	int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	ret = ioctl(fd, VIDIOC_STREAMON, &type);
	if(ret < 0)
		perror("打開設(shè)備失敗");
	//從隊(duì)列中提取一幀數(shù)據(jù)
	struct v4l2_buffer readbuffer;
	readbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	ret = ioctl(fd, VIDIOC_DQBUF, &readbuffer);//從緩沖隊(duì)列獲取一幀數(shù)據(jù)(出隊(duì)列)
	//出隊(duì)列后得到緩存的索引index,得到對(duì)應(yīng)緩存映射的地址mmpaddr[readbuffer.index]
	if(ret < 0)
		perror("獲取數(shù)據(jù)失敗");
	FILE *file = fopen("1.jpg", "w+");//建立文件用于保存一幀數(shù)據(jù)
	fwrite(mmpaddr[readbuffer.index], readbuffer.length, 1, file);
	fclose(file);
	//讀取數(shù)據(jù)后將緩沖區(qū)放入隊(duì)列
	ret = ioctl(fd, VIDIOC_QBUF, &readbuffer);
	if(ret < 0)
		perror("放入隊(duì)列失敗");
	//關(guān)閉設(shè)備
	ret = ioctl(fd, VIDIOC_STREAMOFF, &type);
	if(ret < 0)
		perror("關(guān)閉設(shè)備失敗");
	//取消映射
	for(int i = 0; i < 4; i++)
		munmap(mmpaddr[i], addr_length[i]);
	close(fd);
	return 0;
	
}

運(yùn)行程序,目錄下順利得到j(luò)pg文件,但是打開時(shí)報(bào)?(Not a JPEG file: starts with 0xe0 0xc1)錯(cuò)誤

三、采集到的jpg圖片報(bào)(Not a JPEG file: starts with 0xe0 0xc1)錯(cuò)誤

如上所示,順利采集到1.jpg圖片,但是測(cè)試好幾次均報(bào)該錯(cuò)誤,在仔細(xì)檢查設(shè)置無(wú)誤后,猜測(cè)可能是還未采集到數(shù)據(jù)就已經(jīng)讀取出來(lái)了,所以在隊(duì)列中獲取一幀數(shù)據(jù)的前面加了sleep(5)延遲5s采集,但僅有一次成功,可以讀出但采集的數(shù)據(jù)有損壞,而且修改sleep的數(shù)值,每次的錯(cuò)誤文件的兩個(gè)頭碼還不相同。同時(shí)在申請(qǐng)緩存之前將查詢緩存信息之前現(xiàn)將結(jié)構(gòu)體清0,然后再映射,發(fā)現(xiàn)還是有該問(wèn)題。另外嘗試了加poll函數(shù)等待讀取,同樣無(wú)法讀取。

于是我將采集格式變?yōu)閥uyv格式,發(fā)現(xiàn)程序阻塞至ret = ioctl(fd, VIDIOC_DQBUF, &readbuffer),查找相關(guān)帖子發(fā)現(xiàn)是虛擬機(jī)中USB兼容性問(wèn)題,將設(shè)置中USB兼容性改為USB3.1阻塞消失,同時(shí)jpg格式也順利采集到數(shù)據(jù)。1.jpg文件也可以順利打開。

v4l2攝像頭采集,linux,學(xué)習(xí),筆記

v4l2攝像頭采集,linux,學(xué)習(xí),筆記文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-829034.html

到了這里,關(guān)于Linux攝像頭(v4l2應(yīng)用)——獲取攝像頭一幀圖像的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Ubuntu下python-opencv無(wú)法打開攝像頭,open VIDEOIO(V4L2:/dev/video0): can‘t open camera by index

    Ubuntu下python-opencv無(wú)法打開攝像頭,open VIDEOIO(V4L2:/dev/video0): can‘t open camera by index

    我們?cè)趗buntu下使用opencv獲取攝像頭畫面是,報(bào)錯(cuò) open VIDEOIO(V4L2:/dev/video0): can‘t open camera by index 然后觀察虛擬機(jī)桌面的右下角,如果出現(xiàn)攝像頭有小綠點(diǎn)表示連接成功 然后我們來(lái)測(cè)試一下,攝像頭的畫面 ####### 這是攝像頭傳輸回來(lái)的畫面

    2024年02月16日
    瀏覽(52)
  • RK3568 android11 移植 v4l2loopback 虛擬攝像頭

    RK3568 android11 移植 v4l2loopback 虛擬攝像頭

    v4l2loopback是一個(gè)Linux內(nèi)核模塊,它允許用戶創(chuàng)建虛擬視頻設(shè)備。這種虛擬視頻設(shè)備可以用于各種用途,例如將實(shí)際攝像頭的視頻流復(fù)制到虛擬設(shè)備上,或者用于視頻流的處理和分析等。v4l2loopback的主要作用是 創(chuàng)建一個(gè)虛擬的Video4Linux2設(shè)備,它可以接收來(lái)自其他應(yīng)用程序的視頻

    2024年01月19日
    瀏覽(25)
  • Linux之V4L2驅(qū)動(dòng)框架

    Linux之V4L2驅(qū)動(dòng)框架

    目錄 一、V4L2簡(jiǎn)介 二、V4L2操作流程 ?1.打開攝像頭 2.查詢?cè)O(shè)備的屬性/能力/功能 3.獲取攝像頭支持的格式 4.設(shè)置攝像頭的采集通道 5.設(shè)置/獲取攝像頭的采集格式和參數(shù) 6.申請(qǐng)幀緩沖、內(nèi)存映射、入隊(duì) (1)申請(qǐng)幀緩沖 (2)內(nèi)存映射 (3)入隊(duì) 7.開啟視頻采集 8.讀取數(shù)據(jù)、對(duì)數(shù)

    2024年02月08日
    瀏覽(21)
  • 項(xiàng)目之利用 V4L2應(yīng)用程序框架 進(jìn)行視頻錄制

    目錄 知識(shí)儲(chǔ)備: 視頻采集方式: 處理采集數(shù)據(jù): 相關(guān)結(jié)構(gòu)體: 對(duì)于設(shè)備的操作步驟: ????????V4L2較V4L有較大的改動(dòng),并已成為 2.6 的標(biāo)準(zhǔn)接口,函蓋 videodvbFM... ,多數(shù)驅(qū)動(dòng)都在向 V4l2 遷移。更好地了解 V4L2 先從應(yīng)用入手,然后再深入到內(nèi)核中結(jié)合物理設(shè)備/接口的規(guī)范實(shí)現(xiàn)

    2023年04月09日
    瀏覽(18)
  • V4L2+QT+USB攝像頭實(shí)時(shí)顯示視頻(Arm,Linux,window均適用)

    V4L2+QT+USB攝像頭實(shí)時(shí)顯示視頻(Arm,Linux,window均適用)

    筆者自從學(xué)習(xí)了Framebuffer編程和V4L2編程之后,就想實(shí)現(xiàn)在LCD屏上顯示實(shí)時(shí)視頻 筆者學(xué)習(xí)過(guò)正點(diǎn)I.MX6U Linux C編程中的相關(guān)內(nèi)容,然而原子的例程是針對(duì)OV5640攝像頭寫的,像素格式是RGB 然而USB攝像頭大多支持MJPEG或者YUYV格式,如果要在屏幕上顯示需要進(jìn)行格式轉(zhuǎn)換,而 轉(zhuǎn)換像素

    2023年04月08日
    瀏覽(25)
  • 【C++】開源:Linux端V4L2視頻設(shè)備庫(kù)

    【C++】開源:Linux端V4L2視頻設(shè)備庫(kù)

    ?? ★,° :.☆( ̄▽ ̄)/$: .°★ ?? 這篇文章主要介紹Linux端V4L2視頻設(shè)備庫(kù)。 無(wú)專精則不能成,無(wú)涉獵則不能通?!?jiǎn)⒊?歡迎來(lái)到我的博客,一起學(xué)習(xí),共同進(jìn)步。 喜歡的朋友可以關(guān)注一下,下次更新不迷路?? Video4Linux2( V4L2 )是一個(gè)用于Linux操作系統(tǒng)的視頻設(shè)備驅(qū)動(dòng)框

    2024年02月11日
    瀏覽(21)
  • V4L2常用調(diào)試命令

    這篇文章簡(jiǎn)單記錄一下RK平臺(tái)基于V4L2框架camera調(diào)試過(guò)程中常用的一些命令: (1)查看拓?fù)浣Y(jié)構(gòu):查看media0的pipeline (2)抓數(shù)據(jù)流命令: 對(duì)video0節(jié)點(diǎn),設(shè)置格式為NV12,分辨率為1920x1080,不裁剪,4個(gè)buf輪轉(zhuǎn),--verbose的作用是刷出幀率。 (3)抓圖命令: 類似上面的,將圖像保

    2024年02月03日
    瀏覽(20)
  • linux v4l2架構(gòu)分析之異步注冊(cè)v4l2_async_subdev_notifier_register、v4l2_async_register_subdev、v4l2_async_notifie

    ? ? ? ? 在camera驅(qū)動(dòng)注冊(cè)中,v4l2_async_subdev_notifier_register、v4l2_async_register_subdev、v4l2_async_notifier_register這幾個(gè)函數(shù)都會(huì)被使用到,三者在異步注冊(cè)的實(shí)現(xiàn)中是緊密關(guān)聯(lián)的,所以本文將三者放在一起進(jìn)行分析。本文主要介紹異步注冊(cè)的功能的整體實(shí)現(xiàn)框架,為了更好把握整體思

    2024年02月14日
    瀏覽(36)
  • 汽車IVI中控開發(fā)入門及進(jìn)階(十二):V4L2視頻

    前言 ? ? IVI,In-Vehicle Infotainment,智能座艙信息娛樂(lè)系統(tǒng),或稱車載信息娛樂(lè)系統(tǒng), 汽車中控也被稱為車機(jī)、車載多媒體、車載娛樂(lè)等, 它是智能座艙的重要組成部分。IVI 采用車載專用中央處理器,基于車身總線系統(tǒng)和聯(lián)網(wǎng)服務(wù)提供車載綜合信息處理功能,包括音頻播放、

    2024年02月04日
    瀏覽(21)
  • 內(nèi)存不足V4L2 申請(qǐng)DMC緩存報(bào)錯(cuò)問(wèn)題

    當(dāng)內(nèi)存不足時(shí),V4L2可能存在申請(qǐng)DMA緩存報(bào)錯(cuò),如下日志:

    2024年02月12日
    瀏覽(17)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包