opencv4(五) VideoCapture获取摄像头图像

2023-11-04

环境:ubuntu18.04        opencv4.4.0        

摄像头:usb摄像头,挺老的摄像头,还是usb2.0的

        csi摄像头也支持这种方法


插入摄像头后 ls /dev可以看到 /dev/video0

video后面的数字就是后面需要的设备id

代码段摘自opencv手册,基本使用这段代码就够用了

#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main(int, char**)
{
    Mat frame;
    //--- INITIALIZE VIDEOCAPTURE
    VideoCapture cap;
    // open the default camera using default API
    // cap.open(0);
    // OR advance usage: select any API backend
    int deviceID = 0;             // 0 = open default camera
    int apiID = cv::CAP_ANY;      // 0 = autodetect default API
    // open selected camera using selected API
    cap.open(deviceID, apiID);
    // check if we succeeded
    if (!cap.isOpened()) {
        cerr << "ERROR! Unable to open camera\n";
        return -1;
    }
    //--- GRAB AND WRITE LOOP
    cout << "Start grabbing" << endl
        << "Press any key to terminate" << endl;
    for (;;)
    {
        // wait for a new frame from camera and store it into 'frame'
        cap.read(frame);
        // check if we succeeded
        if (frame.empty()) {
            cerr << "ERROR! blank frame grabbed\n";
            break;
        }
        // show live and wait for a key with timeout long enough to show images
        imshow("Live", frame);
        if (waitKey(5) >= 0)
            break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}

API选择

在linux下自然选择v4l2,也可以用CAP_ANY让opencv自己选择,在linux下gstreamer也是基于V4L实现的,所以gstreamer和v4l2都可以。

需要注意的是,在编译opencv时就要把WITH_V4L打勾,好在在默认情况下WITH_V4L是勾选的

enum   cv::VideoCaptureAPIs {
  cv::CAP_ANY = 0,
  cv::CAP_VFW = 200,
  cv::CAP_V4L = 200,
  cv::CAP_V4L2 = CAP_V4L,
  cv::CAP_FIREWIRE = 300,
  cv::CAP_FIREWARE = CAP_FIREWIRE,
  cv::CAP_IEEE1394 = CAP_FIREWIRE,
  cv::CAP_DC1394 = CAP_FIREWIRE,
  cv::CAP_CMU1394 = CAP_FIREWIRE,
  cv::CAP_QT = 500,
  cv::CAP_UNICAP = 600,
  cv::CAP_DSHOW = 700,
  cv::CAP_PVAPI = 800,
  cv::CAP_OPENNI = 900,
  cv::CAP_OPENNI_ASUS = 910,
  cv::CAP_ANDROID = 1000,
  cv::CAP_XIAPI = 1100,
  cv::CAP_AVFOUNDATION = 1200,
  cv::CAP_GIGANETIX = 1300,
  cv::CAP_MSMF = 1400,
  cv::CAP_WINRT = 1410,
  cv::CAP_INTELPERC = 1500,
  cv::CAP_REALSENSE = 1500,
  cv::CAP_OPENNI2 = 1600,
  cv::CAP_OPENNI2_ASUS = 1610,
  cv::CAP_GPHOTO2 = 1700,
  cv::CAP_GSTREAMER = 1800,
  cv::CAP_FFMPEG = 1900,
  cv::CAP_IMAGES = 2000,
  cv::CAP_ARAVIS = 2100,
  cv::CAP_OPENCV_MJPEG = 2200,
  cv::CAP_INTEL_MFX = 2300,
  cv::CAP_XINE = 2400
}

CAP_PROP属性

高分辨率下有时延:在缺省情况下用VideoCapture打开摄像头,小分辨率640x480可以实时显示,但1920x1080时就会有将近1秒多的时延,这是不可接受的的事情

解决:用set接口将buffersize改小,使得高分辨率下也可以实时显示

cap.set(cv::CAP_PROP_BUFFERSIZE,1);

尝试过修改CAP_PROP_FPS,发现效果并没有改变,猜测这不是一个从软件层面限制帧率的接口,而是与硬件通信修改帧率,而我的摄像头是固定帧率,所以这个属性并不生效,手册中许多属性后面都有一句only for those cameras that support

大部分摄像头的属性我都没有通过设定这些属性而成功,我的摄像头是支持VISCA协议的,我是通过这个协议来设定摄像头属性的,尚不清楚哪些摄像头能够支持这些CAP_PROP

常用的已标红

frame_width,frame_height:图像长宽

fourcc:四个字母用于表示图像格式,当不能自主识别时就需要自行设定

buffersize:缓冲区 value 0-10

enum   cv::VideoCaptureProperties {
  cv::CAP_PROP_POS_MSEC =0,
  cv::CAP_PROP_POS_FRAMES =1,
  cv::CAP_PROP_POS_AVI_RATIO =2,
  cv::CAP_PROP_FRAME_WIDTH =3,
  cv::CAP_PROP_FRAME_HEIGHT =4,
  cv::CAP_PROP_FPS =5,
  cv::CAP_PROP_FOURCC =6,
  cv::CAP_PROP_FRAME_COUNT =7,
  cv::CAP_PROP_FORMAT =8,
  cv::CAP_PROP_MODE =9,
  cv::CAP_PROP_BRIGHTNESS =10,
  cv::CAP_PROP_CONTRAST =11,
  cv::CAP_PROP_SATURATION =12,
  cv::CAP_PROP_HUE =13,
  cv::CAP_PROP_GAIN =14,
  cv::CAP_PROP_EXPOSURE =15,
  cv::CAP_PROP_CONVERT_RGB =16,
  cv::CAP_PROP_WHITE_BALANCE_BLUE_U =17,
  cv::CAP_PROP_RECTIFICATION =18,
  cv::CAP_PROP_MONOCHROME =19,
  cv::CAP_PROP_SHARPNESS =20,
  cv::CAP_PROP_AUTO_EXPOSURE =21,
  cv::CAP_PROP_GAMMA =22,
  cv::CAP_PROP_TEMPERATURE =23,
  cv::CAP_PROP_TRIGGER =24,
  cv::CAP_PROP_TRIGGER_DELAY =25,
  cv::CAP_PROP_WHITE_BALANCE_RED_V =26,
  cv::CAP_PROP_ZOOM =27,
  cv::CAP_PROP_FOCUS =28,
  cv::CAP_PROP_GUID =29,
  cv::CAP_PROP_ISO_SPEED =30,
  cv::CAP_PROP_BACKLIGHT =32,
  cv::CAP_PROP_PAN =33,
  cv::CAP_PROP_TILT =34,
  cv::CAP_PROP_ROLL =35,
  cv::CAP_PROP_IRIS =36,
  cv::CAP_PROP_SETTINGS =37,
  cv::CAP_PROP_BUFFERSIZE =38,
  cv::CAP_PROP_AUTOFOCUS =39,
  cv::CAP_PROP_SAR_NUM =40,
  cv::CAP_PROP_SAR_DEN =41,
  cv::CAP_PROP_BACKEND =42,
  cv::CAP_PROP_CHANNEL =43,
  cv::CAP_PROP_AUTO_WB =44,
  cv::CAP_PROP_WB_TEMPERATURE =45,
  cv::CAP_PROP_CODEC_PIXEL_FORMAT =46,
  cv::CAP_PROP_BITRATE =47
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv4(五) VideoCapture获取摄像头图像 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • linux查看inode使用情况,Linux Inode信息及inode使用率是指什么? - 新手站长网

    Linux服务器云监控会显示Inode信息及inode使用率选项 很多用户什么原因 新手站长网分享Linux系统下的inode原理 inode使用率及inode查询命令 什么是inode信息 Linux inode信息 什么是inode信息
  • 无线充电接收原理图—TWS充电盒方案

    无线充电接收原理图 TWS充电盒方案 原理图百度云下载 链接 https pan baidu com s 1VuIYg5vgPX6wKrWYCZ0bmg 提取码 iq3w
  • java-引用与对象

    我们先定义一个简单的类 class Vehicle int passengers int fuelcap int mpg 有了这个模板 就可以用它来创建对象 Vehicle veh1 new Vehicle 通常把这条语句的动作称之为创建一
  • 目前主流的几款文件上传控件,以及优缺点

    1 WebUploader 官网 http fex baidu com webuploader getting started html API http fex baidu com webuploader doc index html W
  • Linux 帮助手册安装不全

    今天在新安装的 fedora 17 虚拟机上写多线程程序的时候 本想查看下系统帮助手册中关于线程相关函数的说明 结果 tom localhost thread man pthread create No manual entry for p
  • 手把手教你配置BSC(币安智能链)网络,只需5分钟

    这里就用小狐狸 Metamask 钱包了 因为本人坚信用狐狸钱包日后可以撸到空投 1 PC端Chrome浏览器安装metamask钱包插件 要去Metamask官网下载钱包哦 然后把插件添加至Chrome浏览器扩展程序中 这个不会的小伙伴欢
  • 【Vue系列5】——Vue组件化开发入门篇

    点赞多大胆 就有多大产 开源促使进步 献给每一位技术使用者和爱好者 干货满满 摆好姿势 点赞发车 前言 本文主要说一下组件化开发一些概念和基本使用 有基础的小伙伴应该听过组件通信 插槽等这样的概念 我们下篇再说 在具体编码之前我们需要知道两
  • JS判断数组是否存在交集

    2019独角兽企业重金招聘Python工程师标准 gt gt gt
  • 服务器卡死,重启报错: INFO: task blocked for more than 120 seconds

    问题 服务器负载很高 但是CPU利用率不高 服务器经常夯住 网站打不开 SSH连接非常不稳定 输入命令夯住 重启服务器报错 INFO task blocked for more than 120 seconds 问题原因 默认情况下 Lin
  • Linux下安装配置tomcat

    Linux下安装配置tomcat 1 安装 Tomcat版本 6 0 29 Linux版本 Radhat Enterprise 5 5 Jdk版本 1 6 0 20 解压缩tomcat tar zxvf apache tomcat 6 0
  • python+django网上美食菜品订餐系统的设计与实现vue

    随着科学技术的飞速发展 社会的方方面面 各行各业都在努力与现代的先进技术接轨 通过科技手段来提高自身的优势 好吃网线上订餐系统当然也不能排除在外 从美食类型 美食信息的统计和分析 在过程中会产生大量的 各种各样的数据 本文以好吃网线上订餐系
  • JS - 基本语法

    JavaScript是一种脚本语言 主要功能是 动态修改html页面内容 包括创建 删除html页面元素 修改html页面元素的内容 外观 位置 大小等 数据类型和变量 任何语言都离不开数据类型和变量 虽然JavaScript语言是弱类型的
  • D-S证据理论

    一 前言 20世纪60年代美国哈佛大学数学家A P Dempster利用上 下限概率来解决多值映射问题方面的研究工作 自1967年起连续发表了一系列论文 标志着证据理论的诞生 Dempster的学生G Shafer对证据理论做了进一步发展
  • js中for循环与定时器

    js中for循环和定时器的问题 有四个解决方法 这里面涉及到了同步与异步的问题 也可以理解为 解决方法1 闭包 解决方法2 拆分结构 解决方法3 let let和var区别 解决方法4 第三个参数 for var i 0 i lt 6 i
  • 超酷的13个CSS有趣学习网站

    13个CSS有趣学习网站 今天来给大家推荐13个辅助你学习巩固知识的网站 让你边玩边学边记 因为这些网站大多都是国外的大佬们做的 所以网页大多都是英文 为了更好地使用 给你们推荐两个翻译的方式 使用Chrome浏览器自带的翻译功能 可以中英
  • Linux异步IO实现方案总结

    一 glibc aio 1 名称 由于是glibc提供的aio函数库 所以称为glibc aio glibc是GNU发布的libc库 即c运行库 另外网上还有其他叫法posix aio 都是指glibc提供的这套aio实现方案 2 主要接口
  • java中other的用法_java语言 - 如何使用"variable might not have been initialized(变量可能未初始化)"避免System.exit_others_...

    奇怪的是编译器不知道System exit 1 永远不会返回 因此 你所要做的就是给它提供一些不会让你从catch块到try catch之后的东西 例如 try foo Long parseLong args 0 bar Long pars
  • java获取前四个季度结束日期_JAVA使用LocalDate获取当前日期所在季度的开始日期和结束日期...

    需要使用jdk1 8及以上 获取当前日期所在季度的开始日期和结束日期 季度一年四季 第一季度 1月 3月 第二季度 4月 6月 第三季度 7月 9月 第四季度 10月 12月 param isFirst true表示查询本季度开始日期 fa
  • IOU计算Python代码实现

    文章目录 一 目标检测中的IOU代码实现 二 代码 总结 一 目标检测中的IOU代码实现 目标检测中会用IOU大小的值来衡量检测结果与准确结果之间的差距 IOU的计算公式 IOU A B A B 式中A B为检测结果和准确结果 ground
  • opencv4(五) VideoCapture获取摄像头图像

    环境 ubuntu18 04 opencv4 4 0 摄像头 usb摄像头 挺老的摄像头 还是usb2 0的 csi摄像头也支持这种方法 插入摄像头后 ls dev可以看到 dev video0 video后面的数字就是后面需要的设备id