Linux系统USB摄像头测试程序(二)_读取配置

news2024/11/23 12:17:13

1、收先安装gtk3,我的测试机器是ubutn16.04,只要执行下面的安装命令就可以了
    apt-get install libgtk-3-dev
    使用下列命令验证是否安装好gtk3:
    pkg-config --cflags --libs gtk+-3.0
 2、显示结果类似如下:
    -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/mirclient -I/usr/include/mircore -I/usr/include/mircookie -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0说明gtk3可以使用了。
3、文件名:“enquire_camera.c” 代码如下:

#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <zconf.h>
#include <linux/videodev2.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <gtk-3.0/gtk/gtk.h>

//dhl:gtk窗口组件
GtkWidget *window;
GtkWidget *fixed;
GtkWidget *button1,*button2;
GtkWidget *text,*text1,*text2,*text3;
GtkTextBuffer *buffer,*buffer1,*buffer2,*buffer3;
GtkWidget *label1,*label2,*label3,*label_line;

//dhl:消息缓存
char disp[2048]={0};
char temp[128]={0};


//dhl:发现摄像头
void button1_clicked(GtkWidget *widget, gpointer data)
{
	char camera_devices_name[128]={0};
	for (int loop=0;loop<10;loop++) {
		sprintf(camera_devices_name,"/dev/video%d",loop);
		int fd = open(camera_devices_name, O_RDWR);
		if(fd < 0)
		{
			printf("打开设备失败(%s)\n",camera_devices_name);
			close(fd);
			continue;
		}
	    close(fd);
		sprintf(temp,"发现摄像头:%s\n",camera_devices_name);
		strcat(disp,temp);
		gtk_text_buffer_set_text(buffer,disp,-1);
	}
	sprintf(disp,"%s","");
}

//dhl:查询配置信息
void button2_clicked(GtkWidget *widget, gpointer data)
{
	int line_num=0;
	gchar *device_name;
	GtkTextIter start,end;
	gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer1),&start,&end);
	const GtkTextIter s=start,e=end;
	device_name=gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer1),&s,&e,FALSE);
	if (!strcmp(device_name,""))
	{
		sprintf(temp,"请输入摄像头设备文件名\n");
		strcat(disp,temp);
		gtk_text_buffer_set_text(buffer,disp,-1);
		sprintf(disp,"%s","");
		return;
	}
		
		
	//dhl:查询摄像头支持的视频格式
	int fd = open(device_name, O_RDWR);
	if(fd < 0)
	{
		printf("打开设备失败\n");
		return;
	}

	struct v4l2_fmtdesc v4fmt;
	v4fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //视频捕获设备
	int i=0;

	while(1)
	{
		v4fmt.index = i++;
		int ret = ioctl(fd, VIDIOC_ENUM_FMT, &v4fmt);
		if(ret < 0)
		{
			printf("获取摄像头格式失败");
			break;
		}
		printf("index=%d\n", v4fmt.index);
		printf("flags=%d\n", v4fmt.flags);
		printf("description=%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]);
		
		sprintf(temp,"摄像头支持的视频格式(%d)\n",i);
		strcat(disp,temp);
		
		sprintf(temp,"index=%d,", v4fmt.index);
		strcat(disp,temp);
		
		sprintf(temp,"flags=%d,", v4fmt.flags);
		strcat(disp,temp);
		
		sprintf(temp,"description=%s,", v4fmt.description);
		strcat(disp,temp);
		
		sprintf(temp,"pixelformat=%c%c%c%c,", p[0],p[1],p[2],p[3]);
		strcat(disp,temp);
		
		sprintf(temp,"reserved=%d\n", v4fmt.reserved[0]);
		strcat(disp,temp);
		
	}
	
	close(fd);
	
	//dhl:MJPG支持的所有分辨率如下
	fd = open(device_name, O_RDWR);
	if(fd < 0)
	{
		perror("打开设备失败");
		return;
	}
	struct v4l2_frmsizeenum frmsize;
	frmsize.index = 0;
	frmsize.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	printf("MJPEG格式支持所有分辨率如下:\n");
	//frmsize.pixel_format = V4L2_PIX_FMT_YUYV;
	frmsize.pixel_format = V4L2_PIX_FMT_MJPEG;
	sprintf(temp,"MJPG支持的分辨率:\n");
	strcat(disp,temp);
	line_num=1;
	while(ioctl(fd,VIDIOC_ENUM_FRAMESIZES,&frmsize) == 0){
		printf("frame_size<%d*%d>\n",frmsize.discrete.width,frmsize.discrete.height);
		frmsize.index++;
		if ((line_num % 5) != 0) { 
			sprintf(temp,"MJPEG frame_size<%d*%d>, ",frmsize.discrete.width,frmsize.discrete.height);
		}else {
			sprintf(temp,"MJPEG frame_size<%d*%d>\n",frmsize.discrete.width,frmsize.discrete.height);
		}
		strcat(disp,temp);
		line_num++;
		if (line_num == 6) {
			line_num = 1;
		}
	}
	close(fd);
	sprintf(temp,"%s","\n");
	strcat(disp,temp);
	
	
	//dhl:YUV支持所有分辨率如下
	fd = open(device_name, O_RDWR);
	if(fd < 0)
	{
		perror("打开设备失败");
		return;
	}
	//struct v4l2_frmsizeenum frmsize;
	frmsize.index = 0;
	frmsize.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	printf("MJPEG格式支持所有分辨率如下:\n");
	frmsize.pixel_format = V4L2_PIX_FMT_YUYV;
	//frmsize.pixel_format = V4L2_PIX_FMT_MJPEG;
	sprintf(temp,"YUV支持的分辨率:\n");
	strcat(disp,temp);
	line_num = 1;
	while(ioctl(fd,VIDIOC_ENUM_FRAMESIZES,&frmsize) == 0){
		printf("frame_size<%d*%d>\n",frmsize.discrete.width,frmsize.discrete.height);
		frmsize.index++;
		if ((line_num % 5) != 0) { 
			sprintf(temp,"YUYV frame_size<%d*%d>, ",frmsize.discrete.width,frmsize.discrete.height);
		}else {
			sprintf(temp,"YUYV frame_size<%d*%d>\n",frmsize.discrete.width,frmsize.discrete.height);
			
		}
		strcat(disp,temp);
		line_num++;
		if (line_num == 6) {
			line_num = 1;
		}
	}
	
	close(fd);
	
	
	gtk_text_buffer_set_text(buffer,disp,-1);
	sprintf(disp,"%s","");
	
}


int main(int argc,char *argv[])
{
	gtk_init(&argc,&argv);
    
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"USB摄像头测试程序(v1.0.20230728)");
    //gtk_window_set_resizable(GTK_WINDOW(window),FALSE);
    gtk_window_set_default_size(GTK_WINDOW(window),1280,800);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
	
    fixed = gtk_fixed_new();
    gtk_container_add(GTK_CONTAINER(window),fixed);
    
    text = gtk_text_view_new();
    buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
    gtk_text_buffer_set_text(buffer,"",-1);
    gtk_fixed_put(GTK_FIXED(fixed),text,20,480);
    gtk_widget_set_size_request(text,1240,300);
    
    button1 = gtk_button_new_with_label("查询摄像头");
    gtk_fixed_put(GTK_FIXED(fixed),button1,320,14);
    gtk_widget_set_size_request(button1,100,20);
    
    label1 = gtk_label_new("摄像头:");
    gtk_fixed_put(GTK_FIXED(fixed),label1,440,14);
    gtk_widget_set_size_request(label1,50,30);
    
    text1 = gtk_text_view_new();
    buffer1=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text1));
    gtk_text_buffer_set_text(buffer1,"",-1);
    gtk_fixed_put(GTK_FIXED(fixed),text1,500,16);
    gtk_widget_set_size_request(text1,100,28);
    sprintf(disp,"/dev/video0");
	gtk_text_buffer_set_text(buffer1,disp,-1);
    
    button2 = gtk_button_new_with_label("查询配置");
    gtk_fixed_put(GTK_FIXED(fixed),button2,610,14);
    gtk_widget_set_size_request(button2,80,35);
    
    
    label2 = gtk_label_new("分辨率:");
    gtk_fixed_put(GTK_FIXED(fixed),label2,740,18);
    gtk_widget_set_size_request(label2,50,30);
    text2 = gtk_text_view_new();
    buffer2=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text2));
    gtk_text_buffer_set_text(buffer2,"",-1);
    gtk_fixed_put(GTK_FIXED(fixed),text2,800,16);
    gtk_widget_set_size_request(text2,100,28);
    sprintf(disp,"640x480");
	gtk_text_buffer_set_text(buffer2,disp,-1);
    
    
    label3 = gtk_label_new("帧率:");
    gtk_fixed_put(GTK_FIXED(fixed),label3,930,18);
    gtk_widget_set_size_request(label3,50,30);
    text3 = gtk_text_view_new();
    buffer3=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text3));
    gtk_text_buffer_set_text(buffer3,"",-1);
    gtk_fixed_put(GTK_FIXED(fixed),text3,980,16);
    gtk_widget_set_size_request(text3,100,28);
    sprintf(disp,"30");
	gtk_text_buffer_set_text(buffer3,disp,-1);

   
    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
    g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(button1_clicked),NULL);
    g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(button2_clicked),NULL);
   
    
    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}

4、编译命令:gcc enquire_camera.c  -o camera_enquire  `pkg-config --cflags --libs gtk+-3.0` -w

5、运行 “./camera_enquire”
6、运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/880919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哪种电容笔更好用?学生党开学值得买电容笔推荐

在过半个月就马上要到开学季了&#xff0c;随着平板电脑在大学校园内的普及&#xff0c;对电容笔提出了更高的要求。而苹果的正版电容笔产品&#xff0c;虽然有着强大的功能&#xff0c;但由于其具有更加昂贵的价格&#xff0c;让其只能作为一种学习和记录的工具&#xff0c;由…

VM中linux虚拟机配置桥接模式(虚拟机与宿主机网络互通)

VM虚拟机配置桥接模式&#xff0c;可以让虚拟机和物理主机一样存在于局域网中&#xff0c;可以和主机相通&#xff0c;和互联网相通&#xff0c;和局域网中其它主机相通。 vmware为我们提供了三种网络工作模式&#xff0c;它们分别是&#xff1a;Bridged&#xff08;桥接模式&…

Leetcode-每日一题【剑指 Offer 31. 栈的压入、弹出序列】

题目 输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如&#xff0c;序列 {1,2,3,4,5} 是某栈的压栈序列&#xff0c;序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列&#xf…

途乐证券-KDJ分别代表什么?

KDJ是一种技能剖析东西&#xff0c;常见于股票、期货等商场中&#xff0c;它的全称是随机目标&#xff08;KDJ&#xff09;。KDJ目标包括三条线&#xff0c;分别为K线、D线和J线。那么&#xff0c;KDJ分别代表什么呢&#xff1f;本文将从多个视点进行剖析。 1. KDJ的简单介绍 …

Redis 基础知识

Redis 本文是在学习狂神的redis学习笔记 NoSQL NoSQL特点 解耦&#xff01; 1、方便扩展&#xff08;数据之间没有关系&#xff0c;很好扩展&#xff01;&#xff09; 2、大数据量高性能&#xff08;Redis一秒写8万次。读取11万&#xff0c;是一种细粒度的缓存&#xff0c;…

Spring对象装配

在spring中&#xff0c;Bean的执行流程为启动spring容器&#xff0c;实例化bean&#xff0c;将bean注册到spring容器中&#xff0c;将bean装配到需要的类中。 既然我们需要将bea装配到需要的类中&#xff0c;那么如何实现呢&#xff1f;这篇文章&#xff0c;将来阐述一下如何实…

喜盈门、梦百合竞相入局,智能床垫起风了

配图来自Canva可画 现代人的生活压力普遍大&#xff0c;熬夜、失眠是常有的事&#xff0c;提高睡眠质量十分的重要。近些年来&#xff0c;市面上出现了许多辅助睡眠的产品&#xff0c;比如香薰、褪黑素、蒸汽眼罩、降噪耳塞、助眠枕、睡眠监测app等助眠神器。可以说为了睡个好…

​LeetCode解法汇总833. 字符串中的查找与替换

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 你会得到一…

无服务器架构发布啦!

导读Serverless 1.15.2 已发布。The Serverless Framework (无服务器架构&#xff09;允许你自动扩展、按执行付费、将事件驱动的功能部署到任何云。 目前支持 AWS Lambda、Apache OpenWhisk、Microsoft Azure&#xff0c;并且正在扩展以支持其他云提供商。 Serverless 降低了…

无人直播系统究竟是怎么做的?效果如何?

继数字人直播火热之后&#xff0c;或者说数字人直播的热潮还未下来&#xff0c;无人直播又再次刷新了我们的认知&#xff0c;让我们的眼光不得不从数字人身上转移到无人直播上来&#xff0c;因为&#xff0c;跟数字人直播相比&#xff0c;无人直播的成本更低&#xff0c;它更加…

【Spring源码】Spring扩展点及顺序

Spring扩展点及顺序 01-调用BeanFactoryPostProcessor的构造器 02-调用了BeanFactoryPostProcessor的postProcessBeanFactory 03-调用了BeanPostProcessor构造器 04-调用InstantiationAwareBeanPostProcessor构造方法 05-调用了InstantiationAwareBeanPostProcessor接口的Befo…

拆分pdf文件最简单的方法?推荐这种拆分方法

拆分pdf文件最简单的方法&#xff1f;PDF文件拆分是指将一个PDF文件拆分成多个单独的文件。这种操作通常用于将大型PDF文档拆分成多个小文档&#xff0c;以便更方便地管理和共享。例如&#xff0c;如果你需要将一个大型PDF文档发送给多个人&#xff0c;但不希望他们看到整个文档…

mysql 索引 区分字符大小写

mysql 建立索引&#xff0c;特别是unique索引&#xff0c;是跟字符集、字符排序规则有关的。 对于utf8mb4_0900_ai_ci来说&#xff0c;0900代表Unicode 9.0的规范&#xff0c;ai表示accent insensitivity&#xff0c;也就是“不区分音调”&#xff0c;而ci表示case insensitiv…

途乐证券-越跌越买!港股又回调,资金却坚定买入,行情何时到来?

港股重复震动。 8月14日&#xff0c;港股三大指数再次跌落&#xff0c;截至收盘&#xff0c;恒生指数跌1.58%&#xff0c;报18773.55点&#xff0c;恒生科技指数跌1.52%&#xff0c;国企指数跌1.79%。 进入8月以来&#xff0c;港股继续跌落&#xff0c;恒生指数单月跌落6.5%&a…

德事隆® Txron®品牌介绍

德事隆 Txron 螺钉品牌介绍 一&#xff0e;品牌介绍&#xff1a; 创始于美国的百年紧固品牌——德事隆 Txron。 上世纪80年代初&#xff0c;德事隆品牌强势登场&#xff0c;采用美标及澳洲标准&#xff0c;主打高端防腐紧固件…

集群、负载均衡集群、高可用集群简介,LVS工作结构、工作模式、调度算法和haproxy/nginx模式拓扑介绍

一.集群的定义 1.定义 2.分类 &#xff08;1&#xff09;负载均衡集群&#xff08;LBC/LB&#xff09; &#xff08;2&#xff09;高可用集群&#xff08;HAC&#xff09; 二.使用集群的意义 1.高性价比和性能比 2.高可用性 3.可伸缩性强 4.持久和透明性高 三.常见的…

无涯教程-Perl - sethostent函数

描述 该函数应在首次调用gethostent之前调用。 STAYOPEN参数是可选的,在大多数系统上未使用。 当gethostent()检索主机数据库中下一行的信息时,然后sethostent设置(或重置)枚举到主机条目集的开头。 语法 以下是此函数的简单语法- sethostent STAYOPEN返回值 此函数不返回…

opencv进阶02-在图像上绘制多种几何图形

OpenCV 提供了方便的绘图功能&#xff0c;使用其中的绘图函数可以绘制直线、矩形、圆、椭圆等多种几何图形&#xff0c;还能在图像中的指定位置添加文字说明。 OpenCV 提供了绘制直线的函数 cv2.line()、绘制矩形的函数 cv2.rectangle()、绘制圆的函数cv2.circle()、绘制椭圆的…

高忆管理:策略:短期利空落地 市场有望企稳回升

高忆管理指出&#xff0c;基于A股商场出资环境分析&#xff0c;尤其是当时商场存量博弈为主的布景下&#xff0c;主张重视以下“21”主线轮动&#xff1a;&#xff08;1&#xff09;国产科技代替立异&#xff1a;电子&#xff08;半导体、消费电子&#xff09;、通信&#xff0…

人工智能在监控系统中的预测与优化:提升效率和响应能力

引言&#xff1a;人工智能的发展给监控系统带来了新的可能性&#xff0c;通过分析历史监控数据和其他相关数据&#xff0c;人工智能可以预测未来可能发生的事件&#xff0c;如交通拥堵、安全隐患等&#xff0c;并帮助优化监控系统的配置和资源分配。这种预测和优化的能力可以提…