概述
前言:树莓派系统搭载入门初试水教程+Python代码运行打开摄像头 (树莓派搭载arduino单片机+双目摄像头)
软件准备:Arduino IDE软件,树莓派桌面:1准备环境2Arduino IDE3打开摄像头
硬件准备:树莓派,Arduin单片机,双目摄像头
1.软件准备
下载Arduino IDE软件
Windows用户可在浏览器输入网址:https://www.arduino.cc/en/Main/Software
下载安装都是傻瓜式操作,点击下一步即可,直至安装成功。
2.硬件准备
树莓派、Arduin单片机与双目摄像头
3.树莓派桌面
3.1准备环境确保换源、安装Opencv、确保验证无误(确认安装成功过程遗忘的同学,请扫描页面下面的二维码或者点击链接查看)
3.2 Arduino IDE打开Arduino IDE,将Arduino单片机连接到电脑USB接口。参考文章最下方的串口通信参考代码(adruino_串口通信.txt)复制到IDE,然后检查是否连接到Arduino单片机的端口(Arduino Uno)
adruino_串口通信
#include <Servo.h>
Servo steeringServo;
Servo powerServo;
int incomdate = 0;
void setup()
{
pinMode(9,OUTPUT);
pinMode(5,OUTPUT);
Serial.begin(115200);
steeringServo.attach(9);
powerServo.attach(5);
steeringServo.writeMicroseconds(1500);
powerServo.writeMicroseconds(1400);
delay(1000);
powerServo.writeMicroseconds(1500);
}
void loop()
{
steeringServo.writeMicroseconds(1500);
delay(5000);
powerServo.writeMicroseconds(1500);
delay(5000);
while(Serial.available()>0){
incomdate = Serial.read();
if(incomdate == '1'){
steeringServo.writeMicroseconds(2000);
Serial.println("ok");
}
delay(5);
}
}
tools接口选择:
成功图示如下
3.3打开摄像头
将Arduino单片机接口拔下连接到树莓派,双目摄像头接口也连接到树莓派。
在树莓派桌面新建Python文件(任意文件名+“.py”),右键单击打开方式:
编程Thonny Python IDE,可用(raspbery.串口通信.txt)代码验证此文件是否可用
raspbery.串口通信:
import serial
ser = serial.Serial('/dev/ttyACM0',115200,timeout=1)
while True:
send = '1'
ser.write(send.encode())
str1 =ser.readline().decode()
if(str1!=""):
print(str1)
if(str1 == 'okrn'):
print('1m get')
break
ser.close()
4.找寻Arduino单片机的端口
在终端输入:Is/dev/tty*,然后从树莓派上取下Arduino单片机连接线,再次输入:Is
/dev/tty*,前后对比,缺少的那个端口名称即我们需要的端口名称例如:参考代码(CAR.txt)中“ttyACM0”这个是我的端口名称。
单目摄像头参考代码:
import cv2
import numpy as np
area = 0
cap = cv2.VideoCapture(0) # 打开摄像头
while True:
ret, frame = cap.read() # 读取摄像头
#BGR转HSV
frameHSV = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
#HSV中蓝色的范围
lower_bule = np.array([100, 43, 46])
upwer_bule = np.array([124, 255, 255])
#图像处理去除蓝色以外的颜色
mask = cv2.inRange(frameHSV, lower_bule, upwer_bule)
#中值检测
median = cv2.medianBlur(mask,5)
res = cv2.bitwise_and(frame, frame, mask=mask)
#canny边缘检测
Canny = cv2.Canny(median,10,200)
#二值化操作
# ret , binary = cv2.threshold(mask,0,255,cv2.THRESH_BINARY)
#膨胀操作
#kelnel = np.ones((9,9),np.uint8)
#dilaiton = cv2.dilate(binary,kelnel,iterations=1)
#获取图像轮廓坐标
contours, hierarchy = cv2.findContours(Canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
if len(contours) > 0:
boxes = [cv2.boundingRect(cnt) for cnt in contours]
for box in boxes:
x,y,w,h =box
#画框
cv2.drawContours(frame,contours,-1,(0,0,255),3)
#计算图像面积大小
for i in contours:
area+=cv2.contourArea(i)
print(area)
#图像显示
cv2.imshow('frame',frame)
cv2.imshow('median',median)
cv2.imshow('Canny',Canny)
#cv2.imshow('binary',binary)
#cv2.imshow('kelnel',kelnel)
cv2.imshow("mask",mask)
cv2.imshow("res", res)
if cv2.waitKey(1) & 0xFF == ord('q'): # 按q退出
break
cap.release()
cv2.destroyAllWindows()
# 距离的判断根据色块的大小
# 判断色块位置图像侵占
双目参考代码CAR:
import cv2
import numpy as np
import serial
#树莓派与aduino串口通信
def connection(str):
ser = serial.Serial('/dev/ttyACM0', 115200, timeout=1)
while True:
send = str
ser.write(send.encode())
str1 = ser.readline().decode()
if (str1 != ""):
print(str1)
if (str1 == 'okrn'):
print('1m get')
break
ser.close()
#颜色的设定
def colorset(frame):
lower_bule = np.array([100, 43, 46])
upwer_bule = np.array([124, 255, 255])
#BGR颜色转换为HSV
frameHSV = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
#图像处理去除蓝色以外的颜色
mask = cv2.inRange(frameHSV, lower_bule, upwer_bule)
#中值检测
median = cv2.medianBlur(mask, 5)
# 图像加法
res = cv2.bitwise_and(frame, frame, mask=median)
return res
#转向的设定
def Setting():
frame = cv2.imread('1.png', cv2.IMREAD_GRAYSCALE) # 路径
frame = cv2.resize(frame, (256, 256))
#左画面大小
frame_left = frame[:, 0:128]
#右画面大小
frame_right = frame[:, 128:257]
#左画面的图像值
left = np.sum(frame_left == 255)
#右画面的图像值
right = np.sum(frame_right == 255)
full = np.sum(frame == 255)
print(full)#需要重测
print(left)
print(right)
if (left < right & full>80):
#connection("!s2000")
print("left")
else:
#connection("!s1000")
print("right")
#最大连接区域的中点坐标
def centroid(max_contour):
moment = cv2.moments(max_contour)
if moment['m00'] != 0:
cx = int(moment['m10'] / moment['m00'])
cy = int(moment['m01'] / moment['m00'])
return cx, cy
else:
return None
def main():
cap = cv2.VideoCapture(1)
while True:
ret,frame = cap.read()
frame = colorset(frame)
cv2.imshow("Color_set",frame)
#转换为灰度值
#灰度
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#高斯滤波
frame = cv2.GaussianBlur(frame, (5, 5), 0)
#二值化
ret, frame = cv2.threshold(frame, 50, 255, cv2.THRESH_BINARY)
#轮廓检测
contours, hierarchy = cv2.findContours(frame, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print("number of contours:%d" % len(contours))
cv2.drawContours(frame, contours, -1, (0, 255, 255), 2)
# 找到最大区域并填充
area = []
for i in range(len(contours)):
area.append(cv2.contourArea(contours[i]))
max_idx = np.argmax(area)
for i in range(max_idx - 1):
cv2.fillConvexPoly(frame, contours[max_idx - 1], 0)
cv2.fillConvexPoly(frame, contours[max_idx], 255)
#求最大连通域的中心坐标
cnt_centroid = centroid(contours[max_idx])
cv2.circle(contours[max_idx],cnt_centroid,5,[255,0,255],-1)
print("Centroid : " + str(cnt_centroid))
#显示窗口
cv2.imshow("contours", frame)
cv2.imwrite("1.png", frame)
Setting()
if cv2.waitKey(1) & 0xFF == ord('q'): # 按q退出
break
if __name__ == '__main__':
main()
将控制摄像头的代码(CAR.txt)写入.py文件最后运行代码,出现如下界面即打开成功。
最后
以上就是殷勤信封为你收集整理的树莓派系统搭载arduino单片机 打开双目摄像头的全部内容,希望文章能够帮你解决树莓派系统搭载arduino单片机 打开双目摄像头所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复