无人机实验笔记(2019电赛)

2023-05-16

刚看到题目的时候自然想到的是巡空中电缆线。

思路:

        用一个摄像头架高在无人机上,与地理坐标Z成一定角度。如图,无人机看到的电缆线是实际电缆线在地面上的投影,而投影线在 无人机视野的位置 和 无人机与电缆的距离 有关。当无人机靠近电缆线时,投影线在无人机视野中会往下移;当无人机远离电缆线时,投影线在无人机视野中会往上移。那么,控制投影线在无人机视野中的位置就是变相的在控制无人机与电缆线的距离。

所以,问题就是识别电缆线 和 控制无人机飞行。

控制无人机飞行 就是平时的简单巡线,平时摄像头是安装在无人机下方,现在摄像头被架高且成一定角度,巡的是投影线。

识别电缆线的代码:

# -*- coding:utf-8 -*-
import numpy as np
import imutils
import cv2

# Position
Postion_x = 80
Postion_y = 60

frame = cv2.imread("/Users/lnl/Desktop/yellow.jpg")

distance = 0
index = 0
ok = True

#调整图片大小
frame = imutils.resize(frame, width=320) 
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#二值化,因为地面有摩尔纹,可以去掉地面干扰
ret, th1 = cv2.threshold(gray, 80, 255, cv2.THRESH_BINARY_INV)  
#膨胀,补足一些残缺的地方
mask = cv2.dilate(th1, None, iterations=1)  
#寻找轮廓
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]

if len(cnts) > 0:
    j = 0
    for i in cnts:
        #筛选出最长的一根线(也就是X坐标跨度最大的线)
        x_max = max(i[:, :, 0])
        x_min = min(i[:, :, 0])
        if (x_max - x_min > distance):
            distance = x_max - x_min
            index = j
        j += 1

    c = cnts[index]
    
    #判断是否到两边柱子的位置
    mid = np.median(c[:, :, 1])
    for i in c:
        if i[0][1] - mid > 20 or i[0][1] - mid < -20:
            ok = False     #是柱子
            i[0][1] = mid

    #取所需坐标
    rect = cv2.minAreaRect(c)
    box = np.int0(cv2.boxPoints(rect))
    cv2.drawContours(frame, [box], 0, (0, 0, 255), 2)
    Postion_x = int(rect[0][0] // 2)
    Postion_y = int(rect[0][1] // 2)
else:
    Postion_x = 80
    Postion_y = 60

cv2.circle(frame, (Postion_x * 2, Postion_y * 2), 4, (0, 0, 255), -1)

print('ok:', ok)
print('Postion_x,Postion_y', Postion_x, Postion_y)

cv2.imshow('mask', mask)
cv2.imshow('frame', frame)
cv2.waitKey(0)



在背景嘈杂的条件下得到的结果:

调整摄像头角度及高度,得到的识别结果还算理想,但是在实际飞行过程中,无人机达不到预想的结果。

可能是:

1、无人机在起飞过程中看到了不该看到的东西,从起飞过程就开始调节。

2、因为是架高的摄像头,视野范围比较局限,只能在离电缆线一小段距离才能看到电缆线,意味着调节的距离比较有限。

3、无人机控制可能有点问题,因为我们原来摄像头是转了方向的。

 

         在最后一夜的时候有人提出利用地上的摩尔纹,想想应该简单一点,然后通宵将摩尔纹的边框给提取出来了,简化成了绕矩形框飞行。但是。。。我们之前没有测过巡边框,最后一天来不及,就只完成了从柱子一边飞到另一边。

import cv2
import imutils

frame = cv2.imread("/Users/lnl/Desktop/2.png")


frame = imutils.resize(frame, width=320)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
mask = cv2.medianBlur(gray, 3)

mask = 255 - mask

#mask = cv2.erode(mask, None, iterations=2)

mask = cv2.dilate(mask, None, iterations=9)
mask = cv2.erode(mask, None, iterations=2)
edges = cv2.Canny(mask, 100, 150)
edges = cv2.dilate(edges, None, iterations=3)

cv2.imshow("frame",frame)
cv2.imshow("edges",edges)
cv2.waitKey(0)

        代码很简单,但是真的是拿着摄像头在那测了很久。在实际飞行时,上述代码是先腐蚀再膨胀,因为地面、周围的干扰太多,先膨胀会把别的噪声也融进来了。

结果:

 

识别黄色异物并报警请看:

颜色识别

异物报警

源码下载:

       https://github.com/LNanL/drone

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无人机实验笔记(2019电赛) 的相关文章

随机推荐

  • HAL_DMA_IRQHandler()代码详细分析

    这里使用ADC1联动DMA1 xff0c 开启半传输中断 传输中断 debug时 xff0c dma也一直在工作 xff0c 所以半传输中断 传输中断会同时生效 1 adc1使用了DMA1 Stream0 xff0c Instance表示如
  • AD单层显示

    1 Shift 43 S实现的单层效果 xff08 其他曾黑白显示 xff09 2 隐藏其他层 xff0c 只显示一层 xff0c 这样显示直观 xff0c 效果更好
  • 解决Windows更新失败(0x8007000d)的详细方法

    Window更新时 xff0c 一直处于 正在准备windows xff0c 请不要关闭你的计算机 xff0c 时间太长了 xff0c 直接重启 xff0c 再进系统发现这样子了 此代码表示有需要更新的文件丢失或损坏 管理员方式运行cmd
  • A320M HDV 4.0主板用CH341A手动刷BIOS支持5600g,内存不兼容问题排查

    电脑从AMD 3200g 升级到5600g xff0c 主板使用的是华擎A320m HDV R4 0 xff0c BIOS从7 20开始支持5600g xff0c 在没有CPU情况下只能使用BIOS烧录器手动烧录最新BIOS文件 xff0c
  • keil4中增加新器件(厂家未提供keil4支持包)编辑CDB文件

    1 C Keil UV4 FMSH cdb CPU 61 IRAM 0x20000000 0x20003FFF IROM 0x0000000 0x001FFFF CPUTYPE Cortex M0 CLOCK 12000000 ELITTL
  • C++编译初步

    C 43 43 编程中相关文件后缀 a静态库 archive C c cc cp cpp cxx c 43 43 C 43 43 源代码 xff08 需要编译预处理 xff09 hC或者C 43 43 源代码头文件 iiC 43 43 源代
  • 使用VSCode编辑与编译WSL2下源代码

    1 安装WSL2 2 windows下安装VSCode 3 VSCode安装插件Remote Development 北京时间2019年5月3日 xff0c 在 PyCon 2019 大会上 xff0c 微软发布了 VS Code Remo
  • WSL2编译IMX6ULL裸机程序Win10通过Win32DiskImager烧录SD卡

    1 修改imxdownload c文件 完整代码见附录 gcc mixbin c span class token parameter variable o span mixbin 使用上述gcc命令编译生成mixbin可执行文件 该文件只
  • Windows10 IoT 企业版 LTSC 2021安装应用商店

    https github com kkkgo LTSC Add MicrosoftStore releases tag 2019 解压缩 使用管理员方式运行 Add Store cmd xff0c 等待安装完成 xff0c 亲测可用
  • 2020-06-08

    定义带参数的宏 define JH a b t t 61 a a 61 b b 61 t 对两个 a b的值进行交换 下列表述中 正确的是 A 不定义参数 a 和b 将导致编译错误 B 不定义参数 a b 和 t 将导致编译错误C 不定义参
  • 第一阶段C#串口上位机练习--stm32F4总结

    1 实验目的 掌握上位机编程 xff1b 掌握F4串口 xff1b 掌握两者通信数据帧的约定 xff1b 2 实验设备 stm32F4核心板 xff0c Lcd屏幕 xff0c 下载器 xff0c 电脑 3 完成的任务 xff08 1 xf
  • STM32F103同时使用串口2、串口3

    STM32F103同时使用串口2 串口3 步骤rs485 crs485 h中断处理函数 xff1a 一直在用STM32F103做项目 xff0c 记录一下 xff0c 如果觉得有用的 xff0c 也可以参考一下 步骤 IO口的初始化 xff
  • 方法区位置的演变

    Jvm内存 xff1a 方法区位置的演变 xff1a Jdk1 6时 xff0c 方法区在堆中 xff0c 运行时常量池在方法区中 1 6之前 xff0c 方法区称为永久代 1 8之后 xff0c 方法区称为元空间 真正的实现要么是方法区要
  • 线程如何在底层执行指令?

    一条线程是如何执行的呢 一条线程它有自己独立的栈和pc寄存器 xff0c 寄存器的作用来存储字节码指令地址 xff0c 它来告诉电脑要执行的下一条指令 我们通过main方法反编译出来的代码 xff0c 来详细的探究main线程执行方法中代码
  • 在Linux中如何查看文件的修改日期

    有时候可能需要检查有关文件的详细信息 xff0c 例如文件的修改日期 当你要检查文件的最后编辑时间时 xff0c 本文可能会派上用场 在本文将学习4种方法查看文件的修改日期 使用stat stat 可以显示文件属性的详细信息 xff0c 比
  • 对象的组成

    对象有两种情况 xff1b 普通对象有3部分组成 1 对象头 对象头有两部分 xff1a 1是markword xff0c 2是klass pointer 类型指针 2 示例数据 3 对齐填充 数组对象有4部分组成 1 对象头 对象头有两部
  • 符号引用&直接引用

    符号引用不会加载到虚拟机内存中 xff0c 而直接引用是在内存中的 符号引用 xff1a 在java中 xff0c 一个java类会变编译为字节码文件 xff0c 在编译时 xff0c java类并不知道所引用类的实际地址 也就是直接引用
  • 大端序发送数据

    需要发送数字 151510 大端序发送就是 xff1a 00 02 4F D6 string smallData 61 textBox1 Text 小端数据 if smallData 61 61 34 34 MessageBox Show
  • DSP28335笔记--SCI篇

    采用FIFO来实现数据的发送与接收 xff0c 一般就是指采用FIFO中断 在标准SCI模式下通过中断方式来接收或者发送数据可以发现 xff0c 每接收或者发送一个字符就要进一次中断 xff0c 如果发送的字符比较多的话 xff0c 很明显
  • 无人机实验笔记(2019电赛)

    刚看到题目的时候自然想到的是巡空中电缆线 思路 xff1a 用一个摄像头架高在无人机上 xff0c 与地理坐标Z成一定角度 如图 xff0c 无人机看到的电缆线是实际电缆线在地面上的投影 xff0c 而投影线在 无人机视野的位置 和 无人机