目录
一. 使用摄像头
1. 将摄像头连接到我们树莓派
注意:将摄像头的USB口连接到树莓派的任意一个USB口后再开机。一定要先接摄像头再开机,不然树莓派无法识别。
输入lsusb或者ls /dev/video*命令
查看是否有ID:05a3:9230 ARC International Camera或者/dev/video0 设备
有的话说明树莓派已经检测到我们的摄像头设备,可以进行下一步操作
二.升级系统
要使用摄像头模块,你必须使用一个较新的操作系统,它能识别出摄像头模块已连接上。最简单的方法就是直接从树莓派官网去下载一个Raspbian的系统镜像然后安装到一个全新的SD卡上。
不管你用的Raspbian系统版本是什么,都强烈推荐你用如下的命令来更新一下系统:
sudo apt-get update
sudo apt-get upgrade
三.在raspi-config中使能SSH和摄像头服务
sudo raspi-config
选择第5个,按enter键进入配置
先选择第二个SSH:使能SSH服务(如果已开SSH请忽略此步骤)。
接下来选择第一个Camera:使能摄像头服务。
重启我们的树莓派。
sudo reboot
二. 安装opencv
本篇文章是针对python3.8 版本以下的python。
1.查看自己系统的python
清华提供的python有两个版本,分别为python 2.7.16 和 python 3.7.3
2.换源(非常非常重要,成不成功主要看这里)
先在 LX_终端 输入以下代码
sudo nano /etc/apt/sources.list
然后得到如下界面
将里面的代码注释掉(代码前加 # )或者 直接全部删掉,完成后效果如下
将以下代码粘贴进去
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
随后同时按下 Ctrl + x 键,得到如下界面
然后按 y 键,再回车即可,这样就换好一个源了
同理,按照上述步骤更改下一个源
输入以下代码
sudo nano /etc/apt/sources.list.d/raspi.list
将以下代码粘贴进去
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
换源结束,输入以下代码 (这一步一定要有,不然会出错)
sudo apt-get update
3. 安装opencv
上述步骤完成后,输入以下代码(基于python3)
sudo apt-get install python3-opencv -y
出现下面的界面就是安装完成了,如果报错去看一下自己换源了没有,或者源是否正确以及是否 sudo apt-get update
三. 测试opencv
输入: python3
然后再输入: import cv2
四. 解决摄像头分辨率问题
树莓派上opencv默认读取YUY2格式,所以我们要将视频切换成MJPG格式。且要更改摄像头的分辨率。
# -*- coding: cp936 -*-
"""
Author:zhangbo
Date:2019-11-07
Discription:Read Camaro picture and save
"""
import cv2,os,time,datetime
import numpy as np
class CamaroCap(object):
""" 打开视频流 """
def __init__(self):
self.cap = cv2.VideoCapture(0)
#self.cap.set(cv2.CAP_PROP_FPS, 120) 这个有时候生效,有时候不生效不知道是什么原因
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
self.cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
""" 图片信息打印 """
def get_image_info(self,image):
print(type(image))
print(image.shape)
print(image.size)
print(image.dtype)
pixel_data = np.array(image)
print(pixel_data)
""" 逐帧读取数据并保存图片到本地制定位置 """
def Camaro_image(self):
i = 0
while(True):
ret,frame = self.cap.read() #ret:True或者False,代表有没有读取到图片;frame:表示截取到一帧的图片
if ret == False:
break
#self.get_image_info(frame) # print("打印图片信息") 注意:调试的时候可以打开,如果是一直运行程序,建议把这行代码注释掉,避免影响内存占用
cv2.imshow('capture',frame) # 展示图片
mtime = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')
print(mtime)
cv2.imwrite(r"D:\image\\" + str(i) + str("-") + mtime + ".jpg",frame) # 保存图片
i = i + 1
if cv2.waitKey(1) & 0xFF == ord('q'):
break
if __name__ == '__main__':
outmasages = CamaroCap()
outmasages.Camaro_image() # 调用摄像头
outmasages.cap.release() # 释放对象和销毁窗口
cv2.destroyAllWindows()
五. opencv实现颜色追踪与识别
import cv2
import numpy as np #导入库
blue_lower = np.array([100,43,46])
blue_upper = np.array([124,255,255]) #设置颜色区间
cap = cv2.VideoCapture(0) #打开摄像头
cap.set(3,640)
cap.set(4,480) #设置窗口的大小
while 1: #进入无线循环
ret,frame = cap.read() #将摄像头拍摄到的画面作为frame的值
frame = cv2.GaussianBlur(frame,(5,5),0) #高斯滤波GaussianBlur() 让图片模糊
hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) #将图片的色域转换为HSV的样式 以便检测
mask = cv2.inRange(hsv,blue_lower,blue_upper) #设置阈值,去除背景 保留所设置的颜色
mask = cv2.erode(mask,None,iterations=2) #显示腐蚀后的图像
mask = cv2.GaussianBlur(mask,(3,3),0) #高斯模糊
res = cv2.bitwise_and(frame,frame,mask=mask) #图像合并
cnts = cv2.findContours(mask.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2] #边缘检测
if len(cnts) >0 : #通过边缘检测来确定所识别物体的位置信息得到相对坐标
cnt = max(cnts,key=cv2.contourArea)
(x,y),radius = cv2.minEnclosingCircle(cnt)
cv2.circle(frame,(int(x),int(y)),int(radius),(255,0,255),2) #画出一个圆
print(int(x),int(y))
else:
pass
cv2.imshow('frame',frame) #将具体的测试效果显示出来
cv2.imshow('mask',mask)
cv2.imshow('res',res)
if cv2.waitKey(5) & 0xFF == 27: #如果按了ESC就退出 当然也可以自己设置
break
cap.release()
cv2.destroyAllWindows() #后面两句是常规操作,每次使用摄像头都需要这样设置一波
六. 可视化HSV色彩空间阈值编辑器
# -*- coding:utf-8 -*-
import cv2
import numpy as np
"""
功能:读取一张图片,显示出来,转化为HSV色彩空间
并通过滑块调节HSV阈值,实时显示
"""
image = cv2.imread('1.jpg') # 根据路径读取一张图片,opencv读出来的是BGR模式
cv2.imshow("BGR", image) # 显示图片
hsv_low = np.array([0, 0, 0])
hsv_high = np.array([0, 0, 0])
# 下面几个函数,写得有点冗余
def h_low(value):
hsv_low[0] = value
def h_high(value):
hsv_high[0] = value
def s_low(value):
hsv_low[1] = value
def s_high(value):
hsv_high[1] = value
def v_low(value):
hsv_low[2] = value
def v_high(value):
hsv_high[2] = value
cv2.namedWindow('image',cv2.WINDOW_AUTOSIZE)
#H low:
# 0:指向整数变量的可选指针,该变量的值反映滑块的初始位置。
# 179:表示滑块可以达到的最大位置的值为179,最小位置始终为0。
#h_low:指向每次滑块更改位置时要调用的函数的指针,指针指向h_low元组,有默认值0。
(此函数的原型应为void XXX (int, void *); ,其中第一个参数是轨迹栏位置,第二个参数是用户数据(请参阅下一个参数)。如果回调是NULL指针,则不调用任何回调,而仅更新值。)
cv2.createTrackbar('H low', 'image', 0, 179, h_low)
cv2.createTrackbar('H high', 'image', 0, 179, h_high)
cv2.createTrackbar('S low', 'image', 0, 255, s_low)
cv2.createTrackbar('S high', 'image', 0, 255, s_high)
cv2.createTrackbar('V low', 'image', 0, 255, v_low)
cv2.createTrackbar('V high', 'image', 0, 255, v_high)
while True:
dst = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # BGR转HSV
dst = cv2.inRange(dst, hsv_low, hsv_high) # 通过HSV的高低阈值,提取图像部分区域
cv2.imshow('dst', dst)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
至此,我们就完成了树莓派从镜像烧录到实现颜色识别,这样我们最基础的使用树莓派即完成了
七. 参考链接
1. https://blog.csdn.net/weixin_45911959/article/details/122709090?utm_source=miniapp_weixin
2.https://blog.csdn.net/NoamaNelson/article/details/103135056
3.https://blog.csdn.net/weixin_43635647/article/details/97397153?utm_source=miniapp_weixin
4. https://blog.csdn.net/luoyir1997/article/details/109159792?utm_source=miniapp_weixin
5. gitee链接分享:
树莓派: 树莓派从镜像烧录到实现颜色识别https://gitee.com/didiao-hhh/raspberry-pi