Plain Bash C++ C# CSS Diff HTML/XML Java JavaScript Markdown PHP Python Ruby SQL #ASAR 计划
#该程序跟踪一个红球并指示树莓派跟随它。
导入系统
sys.path.append('/usr/local/lib/python2.7/site-packages')
导入cv2
将 numpy 导入为 np
导入操作系统
导入 RPi.GPIO 作为 IO
IO.设置模式(IO.板)
IO.设置(7,IO.OUT)
IO.设置(15,IO.OUT)
IO.设置(13,IO.OUT)
IO.设置(21,IO.OUT)
IO.设置(22,IO.OUT)
def fwd():
IO.output(21,1)#左电机前进
IO.输出(22,0)
IO.output(13,1)#右电机前进
IO.输出(15,0)
定义bac():
IO.output(21,0)#左电机后退
IO.输出(22,1)
IO.output(13,0)#右电机后退
IO.输出(15,1)
定义 ryt():
IO.output(21,0)#左电机后退
IO.输出(22,1)
IO.output(13,1)#右电机前进
IO.输出(15,0)
定义lft():
IO.output(21,1)#左电机前进
IO.输出(22,0)
IO.output(13,0)#右电机后退
IO.输出(15,1)
定义stp():
IO.output(21,0)#左电机停止
IO.输出(22,0)
IO.output(13,0)#右电机停止
IO.输出(15,0)
######################################################################################################
定义主要():
capWebcam = cv2.VideoCapture(0) # 声明一个 VideoCapture 对象并关联到网络摄像头,0 => 使用第一个网络摄像头
# 显示原始分辨率
打印“默认分辨率 = ”+ str(capWebcam.get(cv2.CAP_PROP_FRAME_WIDTH))+“x”+ str(capWebcam.get(cv2.CAP_PROP_FRAME_HEIGHT))
capWebcam.set(cv2.CAP_PROP_FRAME_WIDTH, 320.0) # 将分辨率更改为 320x240,以加快处理速度
capWebcam.设置(cv2.CAP_PROP_FRAME_HEIGHT,240.0)
# 显示更新后的分辨率
打印“更新后的分辨率 = ”+ str(capWebcam.get(cv2.CAP_PROP_FRAME_WIDTH))+“x”+ str(capWebcam.get(cv2.CAP_PROP_FRAME_HEIGHT))
if capWebcam.isOpened() == False: # 检查 VideoCapture 对象是否已成功与网络摄像头关联
print "error: capWebcam not accessed successful\n\n" # 如果没有,则将错误消息打印到标准输出
os.system("pause") # 暂停直到用户按下某个键,以便用户可以看到错误消息
返回#并退出函数(退出程序)
# 结束
while cv2.waitKey(1) != 27 and capWebcam.isOpened(): # 直到按下 Esc 键或网络摄像头连接丢失
blnFrameReadSuccessfully, imgOriginal = capWebcam.read() # 读取下一帧
如果不是 blnFrameReadSuccessfully 或 imgOriginal 为 None: # 如果帧未成功读取
print "error: frame not read from webcam\n" # 将错误消息打印到标准输出
os.system("pause") # 暂停直到用户按下某个键,以便用户可以看到错误消息
break #退出while循环(退出程序)
# 结束
imgHSV = cv2.cvtColor(imgOriginal,cv2.COLOR_BGR2HSV) 复制代码
imgThreshLow = cv2.inRange(imgHSV,np.array([0, 135, 135]), np.array([18, 255, 255]))
imgThreshHigh = cv2.inRange(imgHSV,np.array([165, 135, 135]), np.array([179, 255, 255]))
imgThresh = cv2.添加(imgThreshLow,imgThreshHigh)
imgThresh = cv2.高斯模糊(imgThresh, (3, 3), 2)
imgThresh = cv2.dilate(imgThresh, np.ones((5,5),np.uint8))
imgThresh = cv2.erode(imgThresh, np.ones((5,5),np.uint8))
intRows,intColumns = imgThresh.shape
circles = cv2.HoughCircles(imgThresh, cv2.HOUGH_GRADIENT, 5, intRows / 4) # 用处理后的图像中的所有圆填充变量 circles
如果圆圈不为 None:# 此行是必需的,以防止程序在下一行崩溃(如果没有找到圆圈)
IO.输出(7,1)
for circle in circles[0]: # 对于每个圆圈
x, y, radius = circle # 拆分 x, y 和半径
print "球的位置 x = " + str(x) + ", y = " + str(y) + ", 半径 = " + str(radius) # 打印球的位置和半径
obRadius = int(半径)
x轴= int(x)
如果 obRadius>0&obRadius<50:
print("检测到物体")
如果 xAxis>100&xAxis<180:
打印(“对象居中”)
转发()
elif x轴> 180:
打印(“向右移动”)
ryt()
elif xAxis<100:
打印(“向左移动”)
左移()
别的:
stp()
别的:
stp()
cv2.circle(imgOriginal, (x, y), 3, (0, 255, 0), -1) # 在检测到的物体的中心绘制一个绿色的小圆圈
cv2.circle(imgOriginal, (x, y), radius, (0, 0, 255), 3) # 在检测到的物体周围绘制红色圆圈
# 结束
# 结束
别的:
IO.输出(7,0)
cv2.namedWindow("imgOriginal", cv2.WINDOW_AUTOSIZE) # 创建窗口,使用 WINDOW_AUTOSIZE 确定固定窗口大小
cv2.namedWindow("imgThresh", cv2.WINDOW_AUTOSIZE) # 或使用 WINDOW_NORMAL 允许窗口调整大小
cv2.imshow("imgOriginal", imgOriginal) # 显示窗口
cv2.imshow("imgThresh", imgThresh)
# 结束
cv2.destroyAllWindows()#从内存中删除窗口
返回
######################################################################################################
如果 __name__ == "__main__":
主要的()