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

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

思路:

        用一个摄像头架高在无人机上,与地理坐标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

  • 9
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值