基于opencv的视觉巡线实现

前言

这段时间在和学弟打软件杯的比赛,有项任务就是机器人的视觉巡线,这虽然不是什么稀奇的事情,但是对于一开始不了解视觉的我来说可以说是很懵了,所以现在就想着和大家分享一下,来看看是如何基于opencv来实现巡线的。我这里以ubuntu20.04为例了

正文

1.查看相机设备

首先要完成视觉巡线那必不可少的就是相机了,使用

ll /dev/video*

来查看相机。

这里可以看到我有两个相机设备,一个是我电脑自带的相机video0,另一个是我的usb相机video1。

2.显示实时图像

新建一个工作空间,然后新建一个cpp文件,然后进行相机的初始化,以及调用窗口实时显示图像

#include <opencv2/opencv.hpp>
#include <iostream>
#include <chrono>using namespace std;int camera_width = 640;
int camera_height = 480;int main(int argc, char const *argv[])
{// 初始化变量和对象cv::VideoCapture cap(1);cap.set(CAP_PROP_FRAME_WIDTH, camera_width);cap.set(CAP_PROP_FRAME_HEIGHT, camera_height);// 循环处理每一帧图像while (true) {cv::Mat color_image;cap.read(color_image);if (color_image.empty()) {cerr << "Failed to capture image" << endl;break;}imshow("Color Image", color_image);char key = waitKey(1);if (key == 'q') {break;}}// 释放资源cap.release();destroyAllWindows();return 0;
}

这里初始化cv::VideoCapture cap(1)传入的参数就是上面查看到的设备,如果想要调用系统自带相机,那就改为cap(0)。

3.巡线函数

我这里函数声明如下:

tuple<cv::Mat, float, bool, bool, bool> followBlindPath(cv::Mat color_image) 

由于我想要多个返回值所以就采用了tuple模版,后面采用tie函数进行解包,其中输入参数为要识别的图片,输出参数分别为经识别后标记的图片,以及水平方向上偏差(后面会具体解释是什么偏差),后面三个布尔值表示三个状态,分别为巡线,转弯和停止。

在识别开始之前,由于图片在opencv保存的格式默认为BGR格式图片,我们要转为HSV格式,因为后面的操作都是基于HSV图片进行的。

cv::cvtColor(color_image, hsvFrame, COLOR_BGR2HSV);

效果如下:

然后指定HSV的色域,scalar函数三个参数分别为色调(Hue)、饱和度(Saturation)和亮度(Value),我这里设置的值为黄色的色域。

cv::Scalar color_lower =  cv::Scalar(10, 40, 120);
cv::Scalar color_upper =  cv::Scalar(40, 255, 255);
cv::inRange(hsvFrame, color_lower, color_upper,color_mask);

inRange函数用于判断一个像素或像素矩阵是否在指定的范围内,hsvFrame是输入图像,返回图像color_mask是一个二值图像,即在色域内的为白色,色域外为黑色。

处理效果如下:

点击基于opencv的视觉巡线实现 - 古月居可查看全文

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0.1 + 0.2 不等于 0.3 ?这是为什么?一篇讲清楚!!!

0.1 0.2 不等于 0.3 &#xff1f;这是为什么&#xff1f;一篇讲清楚&#xff01;&#xff01;&#xff01; 分类 编程技术 在很多编程语言中&#xff0c;我们都会发现一个奇怪的现象&#xff0c;就是计算 0.1 0.2&#xff0c;它得到的结果并不是 0.3&#xff0c;比如 C、C、…

高效保护,无粉乳胶手套助您安心工作

在快节奏的现代生活中&#xff0c;我们每天都在与各种细菌、污染物和化学品打交道&#xff0c;因此保护我们的身体健康变得愈发重要。特别是在工作环境中&#xff0c;手部是最容易受到伤害和污染的部位之一。为了提供最佳的保护&#xff0c;优斯特推出了一款高品质的无粉乳胶手…

C语言---顺序表(二)

文章目录 前言1.准备工作2.代码的实现2.1.顺序表的创建、销毁和打印2.2.顺序表的扩容、头插\删、尾插\删2.2.1.扩容2.2.2.尾插2.2.3.头插2.2.3.尾删2.2.4.头删 2.3.指定位置之前插入/删除数据/查找数据2.3.1.指定位置之前插入数据2.3.2.指定位置之前删除数据2.3.3.查找特定数据…

Freecad参数化三维建模的趋势——水利水电设计

最近以chatgpt3.5彻底放开和Kimi小程序如此方便使用而火爆。 三维参数化模型是一个趋势&#xff0c;特别对于这些常规的建筑物设计&#xff0c;基本极少各种曲线曲面&#xff0c;所以特别适合做参数化。 而水利水电工程上应用的设备和产品&#xff0c;也可以建立参数化库&…

微信小程序 uniapp+vue.js医疗在线问诊挂号系统4oy17

预约挂号系统的逐渐发展&#xff0c;进一步方便了广大用户&#xff0c;使其可以更方便、快捷地预约挂号&#xff0c;并且也有效地防止号贩子“倒号”&#xff0c;使用户预约挂号更公平&#xff0c;然而现有预约挂号系统或多或少有所欠缺 小程序前端框架&#xff1a;uniapp 小程…

LeetCode 2529. 正整数和负整数的最大计数——每日一题

上一篇博客&#xff1a;LeetCode 993. 二叉树的堂兄弟节点——每日一题 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.…

「合肥*讯飞」4月19日PolarDB开源数据库沙龙,报名中!

庐州聚智&#xff0c;数字经济启航智慧海 江淮引才&#xff0c;科技浪潮激荡智慧潮 4月19日周五&#xff0c;PolarDB开源社区联合科大讯飞共同举办开源数据库技术沙龙&#xff0c;本次沙龙我们邀请了众多数据库领域的专家&#xff0c;与广大数据库开发者和爱好者们进行技术交…

三十一 超级数据查看器 教程 列表界面的特殊功能

三十一 超级数据查看器 教程 列表界面的特殊功能 点击 打开该讲的视频 点击访问app下载页面 豌豆荚 下载地址 大家好&#xff0c;这一课我们讲一下超级数据查看器的特殊功能&#xff0c;特殊功能能在列表界面空白处点击后&#xff0c;执行一些特殊的功能 首先&#xff0c;我们…

可视化展示点云数据——PCL

pcd文件的可视化 #include<pcl/io/pcd_io.h> #include<pcl/io/ply_io.h> #include<pcl/visualization/cloud_viewer.h>void viewerOneOff(pcl::visualization::PCLVisualizer& viewer) {viewer.setBackgroundColor(0, 0, 0); //设置背景颜色为黑色 }boo…

C#Socket通信实现多人联机和群发消息

1.服务器代码&#xff08;这个服务器每次接受消息后就会遍历连接的客户端&#xff0c;将消息发给其他所有的客户端&#xff09; using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;pu…

【P2P】

文章目录 P2P应用纯P2P架构文件分发&#xff1a;C/S vs P2P文件分发时间&#xff1a;C/S模式文件分发时间&#xff1a;P2P模式 P2P文件分发&#xff1a;BitTorrentP2P文件分发&#xff1a;BitTorrentBitTorrent&#xff1a;请求&#xff0c;发送文件块BitTorrent&#xff1a;ti…

Java常用数据结构与集合

数据结构 数组&#xff1a; 内存地址连续检索效率高(可以通过下标访问成员)增删操作效率低(保证数据越界的问题,需动态扩容)长度固定&#xff0c;扩容的需要新的数组复制或者Arrays类的copyOf方法 链表 内存地址不连续查询快删除慢&#xff0c;因为需要移动指针又分双向链表…