当前位置: 首页 > news >正文

【SLAM】ubuntu 18.04 下 OpenCV 3.2.0 的 opencv_example 运行闪退

本文首发于❄慕雪的寒舍

ubuntu 18.04 下 OpenCV 3.2.0 的 opencv_example 运行闪退问题探究。

1. 问题说明

在之前的ORB-SLAM3项目于ROS运行的博客中,提到过安装ROS时会自己安装一个OpenCV 3.2.0版本,所以最好不要安装其他版本的OpenCV,避免和OpenCV 3.2.0产生冲突,导致ROS链接失败。

今天尝试在ubuntu18.04的虚拟机里面安装OpenCV 3.2.0时,先是遇到了CMake构建问题,又遇到了OpenCV 3.2.0提供的demo代码无法正常运行的问题。

# 编译demo文件并运行
cd opencv-3.2.0/samples/cpp/example_cmake
mkdir build && cd build 
cmake .. && make
./opencv_example

出现的状况就是,当我执行./opencv_example的时候,程序没有任何反应就直接终止了

king@ubuntu:~/slam/pkg/opencv-3.2.0/samples/cpp/example_cmake/build$ ./opencv_example 
Built with OpenCV 3.2.0
Capture is opened
king@ubuntu:~/slam/pkg/opencv-3.2.0/samples/cpp/example_cmake/build$

理论上执行./opencv_example的时候,应该弹出一个摄像头画面的窗口,且该窗口应一直存在。如下图所示

image.png

所以,窗口没有弹出程序就终止了,肯定是有问题的。我们就要看看问题到底在哪里。

2. 问题探究

2.1. 是否识别了摄像头设备

首先是确认我们的usb摄像头到底有没有连到主机上。因为我使用的是虚拟机,所以需要在VMware里面设置让摄像头连接到虚拟机上而不是连到宿主机上。

在VMware的顶栏上,选择虚拟机-可移动设备,在可移动设备的列表里面应该能看到你的USB摄像头。如果看不到,说明windows上都没认出来这个摄像头,请检查USB链接或确认摄像头自身是否损坏。

如下图所示,这里出现了我的USB Camera,且前面有一个勾勾代表摄像头已经练到了虚拟机上。如果没有连接到虚拟机而是宿主机上,这里的弹出菜单会显示“连接(断开与 主机 的链接)”,点击它即可让USB设备连接到虚拟机。

image.png

另外,如果你在虚拟机开启的情况下将摄像头插入电脑,VMware会主动弹窗咨询你新的usb设备是要插入到虚拟机还是宿主机。选择虚拟机即可。

现在VMware里面已经配置好了USB摄像头连到虚拟机,我们就可以进虚拟机内部检查一下是否有摄像头设备了。首先执行ls /dev/video* -l命令,可以看到有两个video设备。说明至少系统是认到了视频输入设备的。

king@ubuntu:~$ ls /dev/video* -l
crw-rw----+ 1 root video 81, 0 Feb 28 18:08 /dev/video0
crw-rw----+ 1 root video 81, 1 Feb 28 18:08 /dev/video1

随后安装一下v4l-utils软件包,它提供了一些摄像头相关的工具,可供我们检测当前主机上的摄像头设备。

sudo apt-get install -y v4l-utils

我们可以通过v4l2-ctl -d /dev/video0 --all命令查看某个设备的详细信息,这里可以看到/dev/video0就是我插入的USB摄像头,分辨率是640*480。说明linux系统已经成功识别了摄像头。

king@ubuntu:~$ v4l2-ctl -d  /dev/video0 --all
Driver Info (not using libv4l2):Driver name   : uvcvideoCard type     : USB Camera: USB CameraBus info      : usb-0000:02:03.0-1Driver version: 5.4.233Capabilities  : 0x84A00001Video CaptureMetadata CaptureStreamingExtended Pix FormatDevice CapabilitiesDevice Caps   : 0x04200001Video CaptureStreamingExtended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:Width/Height      : 640/480Pixel Format      : 'MJPG'Field             : NoneBytes per Line    : 0Size Image        : 614400Colorspace        : sRGBTransfer Function : Default (maps to sRGB)YCbCr/HSV Encoding: Default (maps to ITU-R 601)Quantization      : Default (maps to Full Range)Flags             : 
Crop Capability Video Capture:Bounds      : Left 0, Top 0, Width 640, Height 480Default     : Left 0, Top 0, Width 640, Height 480Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 640, Height 480
Selection: crop_bounds, Left 0, Top 0, Width 640, Height 480
Streaming Parameters Video Capture:Capabilities     : timeperframeFrames per second: 30.000 (30/1)Read buffers     : 0brightness 0x00980900 (int)    : min=-64 max=64 step=1 default=0 value=0contrast 0x00980901 (int)    : min=0 max=95 step=1 default=34 value=34saturation 0x00980902 (int)    : min=0 max=100 step=1 default=56 value=56hue 0x00980903 (int)    : min=-2000 max=2000 step=100 default=0 value=0white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1gamma 0x00980910 (int)    : min=100 max=300 step=1 default=120 value=120power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=1 value=1white_balance_temperature 0x0098091a (int)    : min=2800 max=6500 step=1 default=4600 value=4600 flags=inactivesharpness 0x0098091b (int)    : min=0 max=7 step=1 default=0 value=0backlight_compensation 0x0098091c (int)    : min=0 max=3 step=1 default=2 value=2exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3exposure_absolute 0x009a0902 (int)    : min=78 max=10000 step=1 default=312 value=312 flags=inactivefocus_absolute 0x009a090a (int)    : min=0 max=15 step=1 default=0 value=0 flags=inactivefocus_auto 0x009a090c (bool)   : default=1 value=1

2.2. 摄像头驱动问题?

既然摄像头设备存在,则需要确认摄像头本身是否能被linux正常调用。

测试的方法很简单,下载ubuntu的cheese茄子软件(其实就是windows的相机软件),看看是否能正常打开摄像头。

sudo apt-get install -y cheese

安装完毕后,使用cheese命令即可打开摄像头。结果发现,弹窗是黑的。

image.png

这里我拔除了摄像头,可以看到cheese会显示“no device found”(找不到设备),这就说明,上图中黑屏的情况并不是正常情况。如果摄像头不存在,会直接提示我们找不到设备,而不会黑屏。

image.png

结合之前的信息,可知我们现在linux系统已经识别到了USB摄像头,但没有办法调用它来拍照

用ubuntu下摄像头启动与黑屏问题解决博客里面的方式解决了,在VMware的虚拟机设置里面,把usb兼容性改成3.1就可以了(原本是usb2.0)。修改了之后vm会自动重置虚拟机。

image.png

虚拟机重置了之后,重新连接一下usb摄像头到虚拟机就ok了。此时cheese已经能识别到我们的摄像头并拍摄画面了。

image.png

到这里,说明摄像头能被linux成功识别并调用,摄像头本身并没有问题。

2.3. opencv_example代码探究

既然摄像头本身没有问题,那问题就是在OpenCV3.2.0或者说是在示例代码上了。示例代码samples/cpp/example_cmake/exmaple.cpp的主体并不长,这里直接给出。

// opencv-3.2.0/samples/cpp/example_cmake/exmaple.cpp
int main()
{cout << "Built with OpenCV " << CV_VERSION << endl;Mat image;VideoCapture capture;capture.open(0);if(capture.isOpened()){cout << "Capture is opened" << endl;for(;;){capture >> image;if(image.empty())break;drawText(image);imshow("Sample", image);if(waitKey(10) >= 0)break;}}else{cout << "No capture" << endl;image = Mat::zeros(480, 640, CV_8UC1);drawText(image);imshow("Sample", image);waitKey(0);}return 0;
}

首先尝试将代码中的capture.open(0)改成capture.open("/dev/video0");,会发现问题依旧,启动之后未出现任何弹窗程序就终止了。

尝试将其改成capture.open(1);,可以看到这个设备是不存在的,open函数失败了并打印了错误信息,随后程序走到了No capture并正常显示了黑屏的Hello OpenCV页面。

image.png

这里我发现了一个问题,其实在没有修改代码之前,程序已经打印了Capture is opened,说明摄像头其实已经被open成功了,进入了if(capture.isOpened())为真的分支中。

king@ubuntu:~/slam/pkg/opencv-3.2.0/samples/cpp/example_cmake/build$ ./opencv_example 
Built with OpenCV 3.2.0
Capture is opened
king@ubuntu:~/slam/pkg/opencv-3.2.0/samples/cpp/example_cmake/build$

那么我们就来看看这个分支里面有啥问题会导致程序没有任何报错就退出吧。其中for(;;)是一个死循环,退出条件是内部的两个break。程序没有任何报错就终止,只能是这两个break导致的。

if(capture.isOpened())
{cout << "Capture is opened" << endl;for(;;){capture >> image;if(image.empty())break;drawText(image);imshow("Sample", image);if(waitKey(10) >= 0)break;}
}

所以我们可以修改代码,给这两个break之前加上打印

cout << "Capture is opened" << endl;
for(;;)
{capture >> image;if(image.empty()){cout << "Image is empty! break." << endl; break;}drawText(image);imshow("Sample", image);if(waitKey(10) >= 0){cout << "waitKey() >= 0! break." << endl; break;}
}

再次运行,会发现是第二个break导致程序终止了。

king@ubuntu:~/slam/pkg/opencv-3.2.0/samples/cpp/example_cmake/build$ ./opencv_example 
Built with OpenCV 3.2.0
Capture is opened
waitKey() >= 0! break.
king@ubuntu:~/slam/pkg/opencv-3.2.0/samples/cpp/example_cmake/build$

那肯定是waitKey的返回值大于等于0命中了判断导致的。该函数的原型如下

int cv::waitKey(int delay = 0)

这个函数是干啥用的呢?官方的说明如下:

Waits for a pressed key.

The function waitKey waits for a key event infinitely (when delay = 0) or for delay milliseconds, when it is positive. Since the OS has a minimum time between switching threads, the function will not wait exactly delay ms, it will wait at least delay ms, depending on what else is running on your computer at that time. It returns the code of the pressed key or -1 if no key was pressed before the specified time had elapsed.

这个函数会至少等待delay毫秒的键盘输入,并返回键盘输入的ASCII值。当没有键盘被按下的时候,会返回-1。如果delay传入0则代表永久等待。

既然返回值是按键的ASCII码,我们可以打印一下这个函数的返回值,看看它收到了什么

int key = waitKey(10);
cout << "waitKey() return: " << key  << endl; 
if(key >= 0){cout << "waitKey() >= 0! break." << endl; break;
}

打印的结果是255,但是ASCII码的最大值只到127,这里的255已经超出键盘上按键可能返回的值了,肯定是个无意义的返回值!

waitKey() return: 255
waitKey() >= 0! break.

bing一搜,就找到了类似的帖子:opencv中waitkey()函数返回值为255_以下哪个选项是使用opencv的waitkey函数的返回值的正确描述?-CSDN博客

说白了就是,因为操作系统缘故,原本在没有任何键盘输入时应该返回的-1函数,被当作了一字节的无符号整数处理,返回成了255。

3. 问题解决

现在已经知道了问题的来源了,解决方案就是在判断中过滤掉255这个值,或者直接把判断写死成键盘上的某个按键,只有按下键盘上的特定按键的时候才会退出。

	int key = waitKey(10);cout << "waitKey() return: " << key  << endl; if(key >= 0 && key != 255){cout << "waitKey() >= 0! break." << endl; break;}

过滤掉返回值255之后重新编译,demo就能正常显示摄像头的画面了。左侧可以看到waitKey一直在返回255。

image.png

此时按下键盘上的数字1,可以看到它识别到了ASCII 49并成功退出程序了。

image.png

4. The end

不管咋样,这个困扰了我大半个上午的问题总算是解决啦!

最开始我没想起来去看源码,以为一直是OpenCV没办法正常打开摄像头的问题,搜了一圈都没有找到解决方案。最后给代码加上了打印调试大法才找到了问题所在。感觉前面的折腾有点钻牛角尖了。

相关文章:

【SLAM】ubuntu 18.04 下 OpenCV 3.2.0 的 opencv_example 运行闪退

本文首发于❄慕雪的寒舍 ubuntu 18.04 下 OpenCV 3.2.0 的 opencv_example 运行闪退问题探究。 1. 问题说明 在之前的ORB-SLAM3项目于ROS运行的博客中&#xff0c;提到过安装ROS时会自己安装一个OpenCV 3.2.0版本&#xff0c;所以最好不要安装其他版本的OpenCV&#xff0c;避…...

Linux网络编程——数据链路层详解,以太网、MAC地址、MTU、ARP、DNS、NAT、代理服务器......

目录 一、前言 二、以太网 二、以太网帧格式 三、 MAC地址 四、MTU 1、数据链路层的数据分片 2、MTU对UDP协议的影响 3、MTU对TCP协议的影响 五、ARP协议 1、什么是ARP 2、ARP的作用 3、ARP协议的工作流程 4、ARP缓存表 5、ARP请求报文 6、中间人 六、DNS&…...

Android7 Input(四)InputReader

概述 本文主要描述了Android Input框架中的InputReader的功能&#xff0c;InputReader模块的功能&#xff0c;总结成一句话就是InputReader获取输入设备的事件并将事件进行加工处理&#xff0c;然后传递给QueuedInputListener&#xff0c;最终QueuedInputListener将事件传递给…...

游戏报错?MFC140.dll怎么安装才能解决问题?提供多种MFC140.dll丢失修复方案

MFC140.dll 是 Microsoft Visual C 2015 运行库的重要组成部分&#xff0c;许多软件和游戏依赖它才能正常运行。如果你的电脑提示 "MFC140.dll 丢失" 或 "MFC140.dll 未找到"&#xff0c;说明系统缺少该文件&#xff0c;导致程序无法启动。本文将详细介绍 …...

寻找最大美丽数

# 输入&#xff1a;nums1 [4,2,1,5,3], nums2 [10,20,30,40,50], k 2 # 输出&#xff1a;[80,30,0,80,50] import random class Solution:def findMaxSum(self, nums1, nums2, k):hash_table []sum1 0data []print(**31,\n,\t数据)for key,values in enumerate(nums1):da…...

[Linux]进程地址空间

前言 我们在学习C语言期间&#xff0c;经常可以提及到这些区域&#xff0c;有一个问题&#xff1a;这里的地址空间是内存吗&#xff1f;答案是这里的地址空间并不是内存。这里的地址空间是进程地址空间&#xff0c;下面我们就讲解进程地址空间。 这段空间中自下而上&#xff…...

dfs和bfs算法

DFS&#xff08;深度优先搜索&#xff0c;Depth-First Search&#xff09;和 BFS&#xff08;广度优先搜索&#xff0c;Breadth-First Search&#xff09;是图遍历或搜索算法中的两种基本方法。它们在探索图的节点时采用不同的策略&#xff0c;适用于不同的场景。 ### 深度优先…...

跨站请求是什么?

介绍 跨站请求&#xff08;Cross-Site Request&#xff09;通常是指浏览器在访问一个网站时&#xff0c;向另一个域名的网站发送请求的行为。这个概念在 Web 安全中非常重要&#xff0c;尤其是在涉及到“跨站请求伪造&#xff08;CSRF&#xff09;”和“跨域资源共享&#xff…...

【深度学习与大模型基础】第9章-条件概率以及条件概率的链式法则

简单理解条件概率 条件概率就是在已知某件事发生的情况下&#xff0c;另一件事发生的概率。用数学符号表示就是&#xff1a; P(A|B) 在B发生的前提下&#xff0c;A发生的概率。 计算机例子&#xff1a;垃圾邮件过滤 假设你写了一个程序来自动判断邮件是否是垃圾邮件&#xf…...

C++: 获取auto的实际类型

auto a "hello";auto* b "hello";auto& c "hello";上述 a, b, c 类型分别是什么&#xff1f; 在不使用 IDE 提供的 inlay hints 情况下&#xff0c; 可以编译期获取&#xff0c;然后运行时打印出来: 方法&#xff1a; 用 decltype(var)…...

谷歌开源代理开发工具包(Agent Development Kit,ADK):让多智能体应用的构建变得更简

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

揭开人工智能与机器学习的神秘面纱:开发者的视角

李升伟 编译 人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;早已不再是空洞的流行语——它们正在彻底改变我们构建软件、做出决策以及与技术互动的方式。无论是自动化重复性任务&#xff0c;还是驱动自动驾驶汽车&#xff0c;AI/ML都是现代创新的核…...

35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)

一、线程池概述 1、线程池的优势 线程池是一种线程使用模式&#xff0c;线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能&#xff0c;而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务&#xff0c;这避免了在处理短时间任务时创建与…...

【NumPy科学计算:高性能数组操作核心指南】

目录 前言&#xff1a;技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现运行结果验证 三、性能对比测试方法论量化数据对比结果分析 四、最佳实践推荐方案 ✅常见错误 ❌调试技…...

软考 系统架构设计师系列知识点之杂项集萃(50)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;49&#xff09; 第78题 著作权中&#xff0c;&#xff08;&#xff09;的保护期不受限制。 A. 发表权 B. 发行权 C. 署名权 D. 展览权 正确答案&#xff1a;C。 所属知识点&#xff1a;旧版…...

实现定长的内存池

池化技术 所谓的池化技术&#xff0c;就是程序预先向系统申请过量的资源&#xff0c;然后自己管理起来&#xff0c;以备不时之需。这个操作的价值就是&#xff0c;如果申请与释放资源的开销较大&#xff0c;提前申请资源并在使用后并不释放而是重复利用&#xff0c;能够提高程序…...

定制一款国密浏览器(7):铜锁和BoringSSL

上一章简单介绍了一下国密算法,本章开始进入实战,进行国密算法的移植。算法的移植以铜锁为蓝本,移植到 BoringSSL 中。 BoringSSL 也是由 OpenSSL fork 而来,那能否修改 Chromium 的源码,使用铜锁库呢?这种方式我也考虑并尝试过,最后发现两者的接口差别太大,Chromium …...

Docker 安装CRMEB陀螺匠教程

首先下载代码到服务器中&#xff0c;打开终端&#xff0c;并切换到项目源码根目录&#xff1a; 通过 Docker compose 启动项目 第一次启动时需要拉取和打包相关镜像&#xff0c;所需时长视网络情况而定&#xff0c;需耐心等待。 配置反向代理 参考 Nginx 配置 Nginx 反向代…...

Java中的static都能用来修饰什么?

在Java编程语言中&#xff0c;static关键字是非常重要的修饰符&#xff0c;可以用于多种不同的地方。可用来修饰变量、方法、代码块以及类。 1.静态变量 定义&#xff1a;静态变量属于类本身&#xff0c;而不是类的任何特定实例&#xff08;new出来的对象&#xff09;。 特点&a…...

词法分析器设计实验

掌握生成词法分析器的方法&#xff0c;加深对词法分析原理的理解。掌握设计、编制并调试词法分析程序的思想和方法。本实验是高级语言程序设计、数据结构和编译原理中词法分析原理等知识的综合。 【实验内容及要求】完善以下代码(红色标注处)并加上注释(蓝色标注处) int Getsym…...

matlab求和∑函数方程编程?

matlab求和∑函数方程编程&#xff1f; 一 题目&#xff1a;求下列函数方程式的和 二&#xff1a;代码如下&#xff1a; >> sum_result 0; % 初始化求和变量 for x 1:10 % 设…...

Vue3.5 企业级管理系统实战(十四):动态主题切换

动态主题切换是针对用户体验的常见的功能之一&#xff0c;我们可以自己实现如暗黑模式、明亮模式的切换&#xff0c;也可以利用 Element Plus 默认支持的强大动态主题方案实现。这里我们探讨的是后者通过 CSS 变量设置的方案。 1 组件准备 1.1 修改 Navbar 组件 在 src/layo…...

Python中for循环及其相关函数range(), zip(), enumerate()等

一、Python中的for循环及其相关函数 Python的for循环是算法竞赛中最常用的迭代工具之一&#xff0c;因其简洁和灵活性非常适合快速实现逻辑。以下详细讲解for循环及相关函数在竞赛中的使用场景。 1. for循环基本语法 Python的for循环用于遍历可迭代对象&#xff08;如列表、…...

数据结构与算法——链表OJ题详解(2)

文章目录 一、前言二、OJ续享2.1相交链表2.2环形链表12.2环形链表2 三、总结 一、前言 哦了兄弟们&#xff0c;咱们上次在详解链表OJ题的时候&#xff0c;有一部分OJ题呢up并没有整理完&#xff0c;这一个星期呢&#xff0c;up也是在不断的学习并且沉淀着&#xff0c;也是终于…...

免费送源码:Java+ssm+MySQL 基于PHP在线考试系统的设计与实现 计算机毕业设计原创定制

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对在线考试等问题&#xff0c;对如何通过计算…...

Android之JNI详解

Android之JNI详解 简介创建项目注册动态注册静态注册 关键词解读基础数据类型引用java对象JNI引用与释放cmake配置文件 简介 JNI&#xff08;Java Native Interface&#xff09; 是 Java 提供的一种编程框架&#xff0c;用于在 Java 应用程序中调用和与用其他编程语言&#xf…...

React Hooks: useRef,useCallback,useMemo用法详解

1. useRef&#xff08;保存引用值&#xff09; useRef 通常用于保存“不会参与 UI 渲染&#xff0c;但生命周期要长”的对象引用&#xff0c;比如获取 DOM、保存定时器 ID、WebSocket等。 新建useRef.js组件&#xff0c;写入代码&#xff1a; import React, { useRef, useSt…...

Java基础知识

概念 请介绍全局变量和局部变量的区别 Java中的变量分为成员变量和局部变量&#xff0c;它们的区别如下&#xff1a; 成员变量&#xff1a; 1. 成员变量是在类的范围里定义的变量&#xff1b; 2. 成员变量有默认初始值&#xff1b; 3. 未被static修饰的成员变量也叫…...

体验智能体构建过程:从零开始构建Agent

1. 什么是智能体&#xff1f; 智能体&#xff08;Agents&#xff09;是一种能够感知环境、做出决策并采取行动来实现特定目标的自主实体。智能体的复杂程度各不相同&#xff0c;从简单的响应式智能体&#xff08;对刺激直接做出反应&#xff09;到更高级的智能体&#xff08;能…...

如何从项目目标到成功标准:构建可量化、可落地的项目评估体系

引言 在项目管理领域&#xff0c;"项目成功"的定义往往比表面看起来更复杂。根据PMI的行业报告&#xff0c;67%的项目失败源于目标与成功标准的不匹配。当项目团队仅关注"按时交付"或"预算达标"时&#xff0c;常会忽视真正的价值创造。本文将通…...

大模型论文:Language Models are Few-Shot Learners(GPT3)

大模型论文&#xff1a;Language Models are Few-Shot Learners(GPT3) 文章地址&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2020/file/1457c0d6bfcb4967418bfb8ac142f64a-Paper.pdf 一、摘要 我们证明了&#xff0c;扩大语言模型的规模在任务无关的 few…...

驱动学习专栏--字符设备驱动篇--1_chrdevbase

字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;字符设备就是一个一个字节&#xff0c;按照字节 流进行读写操作的设备&#xff0c;读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC 、 SPI &#xff0c; LCD 等等都是字符设备&…...

muduo库源码分析: TcpConnection

一. 主要成员: socket_&#xff1a;用于保存已连接套接字文件描述符。channel_&#xff1a;封装了上面的socket_及其各类事件的处理函数&#xff08;读、写、错误、关闭等事件处理函数&#xff09;。这个Channel中保存的各类事件的处理函数是在TcpConnection对象构造函数中注册…...

【SLAM】ubuntu 18.04 编译安装 OpenCV 3.2.0 时出现哈希错误

本文首发于❄慕雪的寒舍 1. 前言 1.1. 问题说明 在amd64的ubuntu 18.04 desktop上编译安装 OpenCV 3.2.0 的时候&#xff0c;我遇到了cmake构建错误。错误的核心报错如下 for file: [/home/king/slam/pkg/opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32…...

挂马漏洞 asp连接冰蝎webshell (附webshell源码 仅限学习研究)

目录 ASP WebShell代码 代码说明&#xff1a; 部署步骤&#xff1a; 使用冰蝎客户端连接&#xff1a; 注意事项&#xff1a; ASP WebShell代码 <% 冰蝎连接密码&#xff08;需与冰蝎客户端配置一致&#xff09; Dim key key "mysecretkey123" 自定义密码…...

Grafana将弃用AngularJS-我们该如何迁移

AngularJS 弃用时间线 AngularJS 支持已在 Grafana 9 中正式弃用。在 2024 年 5 月发布的 Grafana 11 中&#xff0c;所有 Grafana Cloud 和自托管安装默认关闭该功能。到 Grafana 12 版本时&#xff0c;将完全移除对 AngularJS 的支持&#xff0c;包括配置参数开关 angular_s…...

基于单片机的病房呼叫系统设计

2.1 总体方案设计 本课题为基于单片机的病房呼叫系统设计&#xff0c;在此将整个系统架构设计如图2.1所示&#xff0c;在此采用八个按键模拟8个不同的病房号&#xff0c;再通过8个LED指示灯对病房号的状态进行指示&#xff0c;当用户按键按键时&#xff0c;相应的LED灯会点亮…...

简述一下Unity的UnityWebRequest

UnityWebRequest是Unity引擎中用于处理网络请求的强大工具&#xff0c;尤其适用于与Web服务器进行交互&#xff0c;比如获取数据、上传文件或下载资源等。相较于旧版的WWW类&#xff0c;UnityWebRequest提供了更灵活、更高效的API&#xff0c;支持多种HTTP方法&#xff0c;并能…...

文件操作和IO - 2

目录 Java 中操作文件 File 概述 属性 构造方法 方法 getParent getName getPath getAbsolutePath getCanonicalPath exists isFile isDirectory createNewFile delete deleteOnExit list listFiles mkdir mkdirs 完&#xff01; Java 中操作文件 Java 对于文件操…...

⑪数据中心网络M-LAG实战

一、DeviceA-M-LAG-Mater配置 1、M-LAG 系统配置。 # m-lag mad exclude interface GigabitEthernet1/0/7 m-lag mad exclude interface Vlan-interface100 m-lag mad exclude interface Vlan-interface101 m-lag system-mac 0002-0002-0002 m-lag system-number 1 m-la…...

Win10系统安装WSL2-Ubuntu, 并使用VScode开始工作

本教程基于博主当前需要使用 WSL2(Windows Subsystem for Linux 2) 而编写&#xff0c;将自己使用的经过分享给大家。有什么意见建议敬请大家批评指正。此过程需要打开 Microsoft Store 话不多说&#xff0c;立即开始~ 文章目录 1. 检查系统版本2. 启动 WSL 功能3. 安装Ubuntu4…...

Node.js种cluster模块详解

Node.js 中 cluster 模块全部 API 详解 1. 模块属性 const cluster require(cluster);// 1. isMaster // 判断当前进程是否为主进程 console.log(是否为主进程:, cluster.isMaster);// 2. isWorker // 判断当前进程是否为工作进程 console.log(是否为工作进程:, cluster.isW…...

Window 10使用WSL2搭建Linux版Android Studio应用开发环境

一、背景 公司基于高通SA8155、SA8295等车载芯片进行座舱系统开发,使用repo统一管理系统及应用源码仓库。 Android应用端使用Ubuntu环境Android Studio进行开发,使用repo进行平台性管理,包含所有应用仓库。由于gradle配置使用了linux下文件软链接,无法直接使用Window环境…...

PostgreSQL 的统计信息

PostgreSQL 的统计信息 PostgreSQL 的统计信息是查询优化和性能调优的基础&#xff0c;系统通过多种统计信息来评估数据分布和访问模式&#xff0c;从而生成高效的执行计划。 一 统计信息类型与用途 1.1 核心统计类别 统计类型存储位置主要用途更新机制表和索引扫描统计pg_…...

【Linux】Linux基础指令

Linux系统初步介绍 Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统&#xff61; 严格来讲,Linux 只是操作系统内核本身,但通常采用“Linux内核”来表达该意思&#…...

【SLAM】在ORB_SLAM2的ROS模式下使用RealSense D435相机

本文介绍了如何在ORB_SLAM2项目中使用RealSense D435相机作为RGB-D输入源&#xff0c;包括ROS下启动D435相机、ORB_SLAM2订阅Topic、ORB_SLAM2读取realsense-viewer录制的rosbag文件等步骤。。 本文首发于❄慕雪的寒舍 1. 前言 先前已经编写了如何用TUM数据集运行ORB_SLAM3以及…...

scapy使用

https://scapy.readthedocs.io/en/latest/introduction.html 在 Mac 上使用 Scapy 抓取特定 IP 的流量并保存到 a.pcap 的步骤如下&#xff1a; 步骤 1&#xff1a;安装 Scapy 在终端中执行以下命令安装&#xff1a; pip install scapy步骤 2&#xff1a;创建 Python 脚本 …...

C2000 系统控制(4) — CPU Memory

CPU 内存 内存控制器 在 C2000 实时微控制器上&#xff0c;RAM 具有不同的特性。这些特性包括&#xff1a; CPU 专用&#xff1a;M0、M1 RAMCPU 和 CLA 共享&#xff1a;LSx RAMCPU、DMA 和 HIC 共享&#xff1a;GSx RAM用于在处理器之间发送和接收消息&#xff1a;MSG RAM …...

Linux网络编程——详解网络层IP协议、网段划分、路由

目录 一、前言 二、IP协议的认识 1、什么是IP协议&#xff1f; 2、IP协议报头 三、网段划分 1、初步认识IP与路由 2、IP地址 I、DHCP动态主机配置协议 3、IP地址的划分 I、CIDR设计 II、子网数目的计算 III、子网掩码的确定 四、特殊的IP地址 五、IP地址的数量限…...

解析医疗器械三大文档:DHF、DMR与DHR

医疗器械的 DHF、DMR 和 DHR 是质量管理体系&#xff08;QMS&#xff09;中的核心文件&#xff0c;贯穿产品全生命周期&#xff0c; 确保医疗器械的安全性、有效性和合规性。 一、三大文件的定义与法规依据 缩写全称法规依据&#xff08;以 FDA 为例&#xff09;核心目的DHF…...