基于opencv Python的无人机视觉pid巡线
时间: 2023-05-31 20:05:41 浏览: 245
本文将介绍如何使用opencv和Python实现无人机视觉PID巡线。
PID控制器是一种常用的控制器,可以实现系统的稳态控制和跟踪控制。在无人机巡线中,PID控制器可以根据摄像头捕捉到的图像信息,调整无人机的飞行姿态,实现无人机沿着指定的线路飞行。
具体实现步骤如下:
1. 读取摄像头图像
使用opencv库中的cv2.VideoCapture()函数读取摄像头图像。代码如下:
```
import cv2
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
2. 图像预处理
为了方便后续的图像处理,需要对原始图像进行预处理。常见的预处理方法包括图像灰度化、二值化等。在巡线中,我们可以将图像转化为灰度图像,并进行二值化处理,提取出线路的轮廓。
```
import cv2
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 二值化处理
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 提取轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow('frame', thresh)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
3. 寻找线路
通过上一步中提取的轮廓,可以得到线路的位置信息。我们可以使用cv2.drawContours()函数将线路绘制在图像上。
```
import cv2
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 二值化处理
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 提取轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(frame, contours, -1, (0, 255, 0), 3)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
4. 计算偏差值
根据线路的位置信息,可以计算出无人机的偏差值。偏差值一般使用线路中心与图像中心的距离来表示。如果偏差值为正,无人机需要向左调整飞行姿态;如果偏差值为负,无人机需要向右调整飞行姿态;如果偏差值为0,无人机保持当前飞行姿态。
```
import cv2
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 二值化处理
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 提取轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 计算偏差值
if len(contours) > 0:
cnt = contours[0]
M = cv2.moments(cnt)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
height, width = gray.shape
deviation = cx - width/2
print("deviation: ", deviation)
# 绘制轮廓
cv2.drawContours(frame, contours, -1, (0, 255, 0), 3)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
5. 控制无人机飞行
根据偏差值,可以使用PID控制器调整无人机的飞行姿态。具体的PID控制算法可以参考相关资料。在这里,我们只是简单地根据偏差值控制无人机向左或向右飞行。
```
import cv2
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 二值化处理
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 提取轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 计算偏差值
if len(contours) > 0:
cnt = contours[0]
M = cv2.moments(cnt)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
height, width = gray.shape
deviation = cx - width/2
print("deviation: ", deviation)
# 控制飞行
if deviation > 10:
print("turn left")
elif deviation < -10:
print("turn right")
else:
print("keep flying")
# 绘制轮廓
cv2.drawContours(frame, contours, -1, (0, 255, 0), 3)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
至此,我们就完成了无人机视觉PID巡线的实现。当然,这只是一个简单的演示程序,实际应用中还需要考虑更多的因素,如光照、摄像头分辨率、噪声等。但是,通过这个例子,我们可以初步了解无人机视觉PID巡线的基本原理和实现方法。
阅读全文