SLAM算法与工程实践——相机篇:传统相机使用(1)

news2024/9/30 3:32:59

SLAM算法与工程实践系列文章

下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此

SLAM算法与工程实践系列文章链接


下面是专栏地址:

SLAM算法与工程实践系列专栏


文章目录

  • SLAM算法与工程实践系列文章
    • SLAM算法与工程实践系列文章链接
    • SLAM算法与工程实践系列专栏
  • 前言
  • SLAM算法与工程实践——相机篇:传统相机使用(1)
    • 相机相关命令
    • 出现的问题
    • 调用相机
      • 以MJPG格式打开相机


前言

这个系列的文章是分享SLAM相关技术算法的学习和工程实践


SLAM算法与工程实践——相机篇:传统相机使用(1)

相机相关命令

插上USB相机,使用命令查看USB设备

lsusb

在这里插入图片描述

可以识别相机

使用命令查看识别到几个摄像头

ll /dev/video*

在这里插入图片描述

然后改变其权限

sudo chmod 777 /dev/video0
sudo chmod 777 /dev/video1

安装 v4l-utils 工具包

sudo apt-get install v4l-utils

使用下列命令查看相机参数

v4l2-ctl -d /dev/video0 --list-formats-ext

在命令行输出为:

ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 2560x800
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                Size: Discrete 2560x720
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x800
                        Interval: Discrete 0.008s (120.000 fps)
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x792
                        Interval: Discrete 0.008s (120.000 fps)
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x400
                        Interval: Discrete 0.008s (120.000 fps)
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x400
                        Interval: Discrete 0.005s (210.000 fps)
                        Interval: Discrete 0.008s (120.000 fps)
                        Interval: Discrete 0.017s (60.000 fps)
                Size: Discrete 640x392
                        Interval: Discrete 0.005s (210.000 fps)
                        Interval: Discrete 0.008s (120.000 fps)
                        Interval: Discrete 0.017s (60.000 fps)
        [1]: 'YUYV' (YUYV 4:2:2)
                Size: Discrete 2560x800
                        Interval: Discrete 0.500s (2.000 fps)
                Size: Discrete 2560x720
                        Interval: Discrete 0.500s (2.000 fps)
                Size: Discrete 1280x800
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 1280x792
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 1280x400
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                Size: Discrete 640x400
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x392
                        Interval: Discrete 0.033s (30.000 fps)

可以看出本相机的参数和对应设置下的帧率,最高为 120 帧,分辨率为 2560x800,我这选用 1280x400

在这里插入图片描述

接下来看看你的USB摄像头支持什么附加属性,只需要执行下面的命令即可

v4l2-ctl -d /dev/video0 --list-ctrls

得到下面的结果

User Controls

                     brightness 0x00980900 (int)    : min=-64 max=64 step=1 default=0 value=0
                       contrast 0x00980901 (int)    : min=0 max=95 step=1 default=0 value=0
                     saturation 0x00980902 (int)    : min=0 max=100 step=1 default=64 value=64
                            hue 0x00980903 (int)    : min=-2000 max=2000 step=1 default=0 value=0
        white_balance_automatic 0x0098090c (bool)   : default=1 value=1
                          gamma 0x00980910 (int)    : min=100 max=300 step=1 default=100 value=100

在这里插入图片描述

使用应用程序茄子(cheese)

输入命令:

sudo apt-get install cheese

装好后,用命令:cheese,即可打开。如果指定打开video1,输入命令:

cheese -d /dev/video1

读取相机配置文件 HBV-1780-2.yaml

int UseStereoCam::loadCamParam(std::string cfgPath) {
    cv::FileStorage fs(cfgPath, cv::FileStorage::READ);
    if (fs.isOpened()) {
        std::cout << "Stereo Camera Paramter is loading..." << std::endl;

        //内参矩阵
        fs["IntrinsicMatrixLeft"] >> IntrinsicMatrixLeft;      //存放内参矩阵,左相机
        IntrinsicMatrixLeft.at<double>(0, 0) = IntrinsicMatrixLeft.at<double>(0, 0) * resizeScalse;
        IntrinsicMatrixLeft.at<double>(1, 1) = IntrinsicMatrixLeft.at<double>(1, 1) * resizeScalse;
        IntrinsicMatrixLeft.at<double>(0, 2) = IntrinsicMatrixLeft.at<double>(0, 2) * resizeScalse;
        IntrinsicMatrixLeft.at<double>(1, 2) = IntrinsicMatrixLeft.at<double>(1, 2) * resizeScalse;

        fs["IntrinsicMatrixRight"] >> IntrinsicMatrixRight;      //存放内参矩阵,右相机
        IntrinsicMatrixRight.at<double>(0, 0) = IntrinsicMatrixRight.at<double>(0, 0) * resizeScalse;
        IntrinsicMatrixRight.at<double>(1, 1) = IntrinsicMatrixRight.at<double>(1, 1) * resizeScalse;
        IntrinsicMatrixRight.at<double>(0, 2) = IntrinsicMatrixRight.at<double>(0, 2) * resizeScalse;
        IntrinsicMatrixRight.at<double>(1, 2) = IntrinsicMatrixRight.at<double>(1, 2) * resizeScalse;


        //畸变系数
        fs["DistCoeffLeft"] >> DistCoeffLeft;            //畸变矩阵,左相机
        fs["DistCoeffRight"] >> DistCoeffRight;             //畸变矩阵,右相机

        //旋转矩阵 平移向量
        fs["RotationMatrix"] >> R;
        fs["TranslationVector"] >> T;
        T = T * resizeScalse;

        fs.release();

        leftFocalLength =
                (IntrinsicMatrixLeft.at<double>(0, 0) + IntrinsicMatrixLeft.at<double>(1, 1)) / 2.0;
        rightFocalLength =
                (IntrinsicMatrixRight.at<double>(0, 0) + IntrinsicMatrixRight.at<double>(1, 1)) / 2.0;
        // 处理焦距(例如取平均值)
        focalLength = (leftFocalLength + rightFocalLength) / 2.0;

        fx = (IntrinsicMatrixLeft.at<double>(0, 0) + IntrinsicMatrixRight.at<double>(0, 0)) / 2.0;
        fy = (IntrinsicMatrixLeft.at<double>(1, 1) + IntrinsicMatrixRight.at<double>(1, 1)) / 2.0;
        cx = (IntrinsicMatrixLeft.at<double>(0, 2) + IntrinsicMatrixRight.at<double>(0, 2)) / 2.0;
        cy = (IntrinsicMatrixLeft.at<double>(1, 2) + IntrinsicMatrixRight.at<double>(1, 2)) / 2.0;


        baseline = cv::norm(T) / 100;     //基线(baseline)单位设置为分米

        std::cout << "camera parameter loaded successfully!" << std::endl;

        return 0;

    } else {
        std::cout << "Failed to load camera parameter!" << std::endl;
        return -1;
    }

}

出现的问题

参考:

解决OpenCV的GStreamer warning警告

在用opencv调用摄像头时报错

在这里插入图片描述

[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (935) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1758) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Device '/dev/video0' failed during initialization
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (515) startPipeline OpenCV | GStreamer warning: unable to start pipeline
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1057) setProperty OpenCV | GStreamer warning: no pipeline
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
摄像头打开失败!

解决办法:

修改打开摄像头的代码如下:

cap.open(0,CAP_V4L2);

调用相机

在编写多个主函数共用srcinclude定义的类的文件时,CMakeLists.txt的编写应该类似下面的写法,然后包含每个子项目的子文件夹

cmake_minimum_required(VERSION 2.8)
project(DEPTH_COMPUTE)

IF (NOT CMAKE_BUILD_TYPE)
    SET(CMAKE_BUILD_TYPE Release)
ENDIF ()

MESSAGE("Build type: " ${CMAKE_BUILD_TYPE})


# set path
set(LIB_PATH ${PROJECT_SOURCE_DIR}/lib)
set(HEAD_PATH ${PROJECT_SOURCE_DIR}/include)
set(EXEC_PATH ${PROJECT_SOURCE_DIR}/bin)

set(DEPTH_LIB calc_depth)   # set libiary name

find_package(OpenCV 4 REQUIRED)
find_package(Eigen3 3.1.0 NO_MODULE)
find_package(Pangolin REQUIRED)

include_directories(${HEAD_PATH})
aux_source_directory(${PROJECT_SOURCE_DIR}/src LIB_SRC)

SET(LIBRARY_OUTPUT_PATH ${LIB_PATH})
add_library(${DEPTH_LIB} SHARED ${LIB_SRC})
TARGET_LINK_LIBRARIES(${DEPTH_LIB}
        ${OpenCV_LIBS}
        ${EIGEN3_LIBS}
        ${Pangolin_LIBRARIES}
)


# add subdirectories 这里是具体的主函数
add_subdirectory(useCamForShot) 
add_subdirectory(openCamera)

子项目的CMakeLists.txt应该如下

cmake_minimum_required(VERSION 2.8)
project(OPENCAM)

find_package(OpenCV 4 REQUIRED)

include_directories(${HEAD_PATH})
link_directories(${LIB_PATH})


set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-O3")
set(EXECUTABLE_OUTPUT_PATH  ${EXEC_PATH})

#add_library(${DEPTH_LIB} SHARED  ${SRC_LIST})

add_executable(open_camera open_camera.cpp)
target_link_libraries(open_camera ${DEPTH_LIB} ${OpenCV_LIBS})

以MJPG格式打开相机

参考:

OpenCV+V4L实现MJPG格式拉取USB摄像头

关于openCV VideoCapture获取摄像头MJPG视频的问题

相机支持的视频流格式

在这里插入图片描述

在这里插入图片描述

在打开相机后,设置参数

capture.open(camIndex, cv::CAP_V4L);    // open camera

//设置编码格式,这里只能写在分辨率和帧率后面,否则无效
capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));//视频流格式

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

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

相关文章

登录/验证码/注册

登录 pom文件 <!--hutool工具类--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.9</version></dependency><!--jwt--><dependency><groupId>io.jsonw…

maui 调用文心一言开发的聊天APP 3

主要是对代码进行了优化 上一个版本写死了帐号跟密码 &#xff0c;这一个帐本有户可以直接设置对相关的key以及secret如果设置错时&#xff0c;在聊天中也会返回提示。注册帐号时同时也设置了key及secrete升级到了net.8.0导出APK&#xff0c;上一个版本是导出abb.解决了变型问…

Redis新数据类型-Bitmaps

目录 Bitmaps 简介 命令 1. setbit (1) 格式 (2) 实例 2. getbit (1) 格式 (2) 实例 3. bitcount (1) 格式 (2) 实例 4. bitop (1) 格式 (2) 实例 我的其他博客 Bitmaps 简介 Bitmaps 是 Redis 的一种新数据类型&#xff0c;它是一种用于存储位信息的数据结构&…

Netty详细文档

Netty教程 文章目录 Netty教程 Netty简介Netty 的介绍Netty 的应用场景互联网行业游戏行业大数据领域其它开源项目使用到 Netty Netty 的学习资料参考 Java BIO编程I/O 模型BIO、NIO、AIO 使用场景分析Java BIO 基本介绍Java BIO 工作机制Java BIO 应用实例问题分析 Java NIO编…

腾讯云Elasticsearch Service产品体验

基本介绍 产品概述 腾讯云 Elasticsearch Service&#xff08;ES&#xff09;是云端全托管海量数据检索分析服务&#xff0c;拥有高性能自研内核&#xff0c;集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群&#xff0c;也支持免运维、自动弹性、按需…

iOS使用CoreText完成txt阅读器

CoreText是一个高效处理字符和字形转换和进行文字排版的框架&#xff0c;API基于C语言。 常见的CoreText类介绍 &#xff08;1&#xff09;、CFAttributedStringRef 属性字符串&#xff0c;用于存储需要绘制的文字字符和字符属性 &#xff08;2&#xff09;、CTFramesetterR…

Layui实现自定义的table列悬停事件并气泡提示信息

1、概要 使用layui组件实现table的指定列悬停时提示信息&#xff0c;因为layui组件中没有鼠标悬停事件支持&#xff0c;所以需要结合js原生事件来实现这个功能&#xff0c;并结合layui的tips和列的templte属性气泡提示实现效果。 2、效果图 3、代码案例 <!DOCTYPE html&g…

Spark编程入门

1.8 Spark编程入门 1.8.1 通过IDEA创建Spark工程 ps:工程创建之前步骤省略,在scala中已经讲解,直接默认是创建好工程的 导入Pom文件依赖 <!-- 声明公有的属性 --><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler…

企业电子招投标采购系统源码之鸿鹄电子招投标系统+电子招投标的组成

招投标管理系统是一款适用于招标代理、政府采购、企业采购和工程交易等领域的企业级应用平台。该平台以项目为主线&#xff0c;从项目立项到项目归档&#xff0c;实现了全流程的高效沟通和协作。通过该平台&#xff0c;用户可以实时共享项目数据信息&#xff0c;实现规范化管理…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十四:系统设置模块相关功能实现

一、本章内容 本章使用已实现的公共组件实现系统管理中的系统设置模块相关功能,包括菜单管理、角色管理、日志管理、用户管理、系统配置、数据字典等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址:

Duplicate keys detected: This may cause an update error.【Vue遍历渲染报错的解决】

今天在写项目时&#xff0c;写到一个嵌套评论的遍历时&#xff0c;控制台出现了一个报错信息&#xff0c;但是并不影响页面的渲染&#xff0c;然后一看这个错的原因是 key值重复&#xff0c;那么问题的解决方式就很简单了。&#xff08;vue for循环读取key值时&#xff0c; key…

docker 安装keepalive

docker 安装keepalive 1.Keepalived 简介 Keepalived 是 Linux 下一个轻量级别的高可用解决方案。高可用(High Avalilability,HA)&#xff0c;其实两种不同的含义&#xff1a;广义来讲&#xff0c;是指整个系统的高可用行&#xff0c;狭义的来讲就是之主机的冗余和接管&#…

stateflow之广播时间及案例分析

目录 前言 1.何谓广播事件&#xff1f;作用是啥&#xff1f; 2.本地广播事件 3.直接广播事件 前言 虽然广播时间官方文档以及好多博主已经做出介绍&#xff0c;但个人在阅读的时候总是觉得费解&#xff0c;要么直接按官方内容陈述&#xff0c;要么缺少案例分析讲解&#xf…

节流防抖:提升前端性能的秘密武器(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

flex布局,flex-direction, justify content, align-content

目录 flex-direction justify content&#xff1a; flex-wrap align-items align-content flex-flow flex:1 align-self order属性定义项目排列顺序 已知html文件为&#xff1a; <div class"given"><span>1</span><span>2</span…

大数据云计算——Docker环境下部署Hadoop集群及运行集群案列

大数据云计算——Docker环境下部署Hadoop集群及运行集群案列 本文着重介绍了在Docker环境下部署Hadoop集群以及实际案例中的集群运行。首先&#xff0c;文章详细解释了Hadoop的基本概念和其在大数据处理中的重要性&#xff0c;以及为何选择在Docker环境下部署Hadoop集群。接着&…

Ps:认识 RGB 曲线

曲线 Curves本质上是用于调整通道的命令&#xff0c;因此在不同的颜色模式&#xff08;比如&#xff0c;RGB、CMYK、Lab、灰度、双色调等&#xff09;下有着不同的表现和操作方式。颜色模式的不同影响了曲线的坐标系、可调整的通道以及可实现的效果。 在 RGB 颜色模式下的曲线&…

Vue之Computed(计算属性)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

IDEA之设置项目包的结构层级为eclipse默认样式

idea默认项目包的结构层级如下: 想修改成eclipse默认的那种样式&#xff0c;设置步骤如下: 1.点击下图中红框图标进行设置 2.选择 Tree Appearance&#xff0c;取消勾选 Compact Middle Packages 3.勾选红框里的两个选项&#xff0c;Flatten Packages 和 Hide Empty Middle Pa…

Python数据科学视频讲解:Python序列的概念及通用操作

2.10 Python序列的概念及通用操作 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.10节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;…