我是靠谱客的博主 殷勤信封,最近开发中收集的这篇文章主要介绍树莓派系统搭载arduino单片机 打开双目摄像头,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言:树莓派系统搭载入门初试水教程+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单片机 打开双目摄像头所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部