其他分享
首页 > 其他分享> > 无人机实验(提取目标区域)

无人机实验(提取目标区域)

作者:互联网

       无人机飞行过程中,飞的越高,视野范围也越远,而所需要的区域只是一部分,额外的区域都会成为干扰,那么就需要提取目标区域。

       这是我们的高空俯视图,从图中看出,我们的目标区域明显的特点是:很大面积的白色的底。那方法就显而易见了,先删选出白色区域,再提取轮廓点,最后根据轮廓点在原图提取出目标区域。

代码:

import cv2
import numpy as np
import imutils
from imutils.perspective import four_point_transform


frame = cv2.imread("cut3.JPG")
frame = imutils.resize(frame, width=320)    #调整图片大小

edges = cv2.Canny(frame,100,300)   #边缘检测,只是为了显示

#提取白色区域
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, np.array((0., 0., 160)), np.array((180., 15.,255.)))
mask = cv2.medianBlur(mask,3)           #去椒盐噪

#提取白色区域轮廓点
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]
aimcnt = None


if len(cnts) > 0:
    #根据面积大小,从大到小排序
    cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
    #找到目标轮廓四个角点
    for i in cnts:
        arc = cv2.arcLength(i, True)    #计算周长,下面函数一般要以周长为参数
        approx = cv2.approxPolyDP(i, 0.1 * arc, True)  #提取近似轮廓点
        if len(approx) == 4:
            aimcnt = approx
            break

#rect = cv2.minAreaRect(cnts[0])
#box = np.int0(cv2.boxPoints(rect))     #这里也能得到四个轮廓点,只是在这幅图中效果没有上面方法理想


#绘制四个目标轮廓点
newFrame=frame.copy()
for i in aimcnt:
    cv2.circle(newFrame, (i[0][0],i[0][1]),4, (0, 0, 255), -1)


#提取目标区域
aimFrame = four_point_transform(frame, aimcnt.reshape(4, 2))
aimMask = four_point_transform(mask, aimcnt.reshape(4, 2))
aimEdges =  four_point_transform(edges, aimcnt.reshape(4, 2))

aimGray = cv2.cvtColor(aimFrame,cv2.COLOR_BGR2GRAY)   #转化为灰度图,进行霍夫圆检测

#检测圆
circles = cv2.HoughCircles(aimGray,cv2.HOUGH_GRADIENT,1,100,param1=100,param2=20,minRadius=1,maxRadius=20)

#绘出圆
if circles is not None:
        for i in circles[0,:]:
            cv2.circle(aimFrame,(i[0],i[1]),i[2],(255,0,0),2)
            Circles_x = int(i[0])
            Circles_y = int(i[1])
        cv2.line(aimFrame, (circles[0][0][0], circles[0][0][1]), (circles[0][1][0], circles[0][1][1]), (255, 0, 0), 2)
else:
    Circles_x = 160  #开启摄像头时的图像中点
    Circles_y = 120


cv2.imshow('newFrame',newFrame)
cv2.imshow('mask',mask)
cv2.imshow('edges',edges)

cv2.imshow('aimFrame',aimFrame)
cv2.imshow('aimMask',aimMask)
cv2.imshow('aimEdges',aimEdges)


cv2.waitKey(0)

结果图:

 

源码下载:

         https://github.com/LNanL/drone

标签:circles,提取,mask,frame,imshow,cv2,cnts,无人机,实验
来源: https://blog.csdn.net/LNL_LNL/article/details/100126127