树莓派——Opencv_python基本操作
虚拟环境:
虚拟环境(Virtual Environment) 是Python中一个非常重要的概念,它主要用于解决不同项目之间的依赖库冲突问题。在Python开发中,不同的项目可能需要不同版本的库,而全局安装这些库可能会导致版本冲突。虚拟环境则提供了一种方式,允许每个项目都有自己独立的Python解释器和依赖库集合,从而避免了这种冲突。
当你创建一个虚拟环境时,你实际上是在你的系统中创建了一个隔离的Python环境。 这个环境有自己的Python解释器、库和安装路径,它与全局Python环境完全独立。因此,你可以在一个虚拟环境中安装特定版本的库,而不会影响到全局环境或其他虚拟环境。
(1)创建虚拟环境:
python3 -m venv --system-site-packages OpenCV
- python3:指定使用Python 3。
- -m venv:使用Python的模块(module)方式运行venv模块,该模块用于创建虚拟环境。
- –system-site-packages:这个选项使得创建的虚拟环境能够访问系统级别的Python包(即安装在全局环境中的包)。如果不使用这个选项,虚拟环境将是完全独立的,只能访问在该虚拟环境中安装的包。
- diy_camera:这是创建的虚拟环境的目录名。执行完这条命令后,当前目录下会生成一个名为diy_camera的文件夹,里面包含了虚拟环境的所有内容。
(2)激活虚拟环境:
当你使用source命令激活Python虚拟环境后,你就已经“进入”了这个虚拟环境。激活虚拟环境的过程并不会改变你的当前工作目录(即你通过pwd命令看到的路径),但它会修改你的shell环境,使得后续执行的Python命令和脚本都会在这个虚拟环境中运行。
source OpenCV/bin/activate
- source:这是一个shell命令,用于在当前shell会话中读取并执行指定文件中的命令。在bash、zsh等shell中常用。它的作用类似于.命令(即. diy_camera/bin/activate)。
- diy_camera/bin/activate:这是虚拟环境中的一个脚本,用于激活虚拟环境。激活后,当前shell会话将使用这个虚拟环境中的Python解释器和库,直到虚拟环境被停用(通过执行deactivate命令)。
要退出虚拟环境,只需在当前shell会话中运行deactivate命令。这将恢复你的shell环境到激活虚拟环境之前的状态,命令行提示符也会相应地发生变化。
给pip换源:
pip是python中用来安装其他的软件库的一个工具,使用pip进行软件库安装时,pip会到源文件列表中去读取该软件的信息,这个源文件列表就是相当于保存各个文件的下载地址。
命令:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
命令 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ 是用于配置 pip 以使用清华大学开源软件镜像站作为默认的 Python 包索引源。这样做可以加速在中国境内访问 PyPI(Python Package Index)的速度,因为清华大学镜像站通常对国内用户有更快的响应速度。
一、picamera2库:
拍第一张照片并生成.jpg图片:
代码示例:
from picamera2 import Picamera2, Preview
import time
picam2 = Picamera2()
camera_config = picam2.create_preview_configuration()
picam2.configure(camera_config)
picam2.start_preview()
picam2.start()
time.sleep(2)
picam2.capture_file("test.jpg")
代码讲解:
1.导入库:
from picamera2 import Picamera2, Preview
import time
上面的代码从picamera2库中导入了Picamera2类和Preview枚举(或类),并导入了Python的time模块,以便进行延时操作。
2.初始化相机:
picam2 = Picamera2()
这行代码创建了一个Picamera2类的实例,命名为picam2,用于代表并控制Raspberry Pi上的相机模块。
3.配置预览:
camera_config = picam2.create_preview_configuration()
通过调用picam2实例的create_preview_configuration方法,这行代码生成了一个预览配置对象,并将其存储在camera_config变量中。这个配置对象可能包含预览的分辨率、帧率等参数(具体取决于picamera2的实现)。
4.应用配置:
picam2.configure(camera_config)
使用configure方法,将之前创建的预览配置应用到相机上。
5.启动预览:
picam2.start_preview()
通过调用start_preview方法,这行代码启动相机的预览功能。摄像头捕捉的图像会实时显示在某个显示设备上。
6.启动相机:
picam2.start()
start()方法用于启动摄像头的视频录制或图像捕捉功能
7.延时和捕获图像:
time.sleep(2)
picam2.capture_file("test.jpg")
首先,通过time.sleep(2)使程序暂停2秒,以确保相机有足够的时间启动预览(如果需要的话)。然后,调用capture_file方法捕获当前相机视图中的图像,并将其保存为名为test.jpg的文件。
图像保存的地址是可以设置的只需要将第二行代码改成详细地址
例如:
picam2.capture_file("/家目录/工作空间/照片/test.jpg")
picam2.capture_file("/home/ThePun/Python_WS/Photo_lib/test.jpg")
二、OpenCV库:
需要了解的知识:
1.图像是什么?
2.模拟图像和数字图像:
3.API和函数的区别:
函数是一段能够实现某个功能的代码,是作为一个程序的内部部分,而API是作为一个接口是用于软件与软件之间的交互,用于软件外部能够通过这个接口访问到软件内部的某个功能,如软件B能够通过这个接口使用软件A中的某个功能。
API——应用程序编程接口, 类似于硬件接口,这些接口帮助你能够使用内部的资源。
例如:
1. 对于硬件接口,你使用U盘是则可以访问到你的电脑,你可以给u盘传输文件,实现了文件传输的功能
2. 而软件接口,就像我创造了一个应用软件,我只希望别人能够通过我的软件做一些我允许的事,那么我就要把我的整个软件封闭,但是要预留几个接口,这几个接口能够访问内部我允许的内容,相当于接口A只通向文件删除功能的区域,接口B只能通向查找文件功能的区域,但是也只能调用对应的功能,不能访问到内部数据或者代码。如果没有设置接口,那么外部就不能访问到这个软件,因为软件是被封装的,你看不到里面的代码,没有接口也用不了该软件的功能。
这里不要误解,你在windows上打开电脑管家去进行垃圾清理,这是电脑管家调用了系统给的API去把对应的文件删除,系统也是一个软件,而你打开电脑管家也是系统给你提供了一个能够打开电脑管家软件界面的API,你能看到的就是你双击了它的图标,这个双击也可以说是一个接口。
(1)OpenCV模块:
基础模块:
core模块中的数据结构就是用于更好的保存一帧图片的信息,大小,每个像素的RGB和L(亮度)等的数据类型。
进阶模块:机器学习,目标检测这些
(2)OpenCV基本操作:
1.图像的IO操作:
读取图像——cv.imread()
API:
cv.imread()
参数说明:
显示图像——cv.imshow()
API:
cv.imshow()
参数说明:
保存图像——cv.imwrite()
API:
cv.imwrite()
参数说明:
绘制直线——cv.line(img,start,end,color,thickness)
API:
cvline(img,start,end,color,thickness)
参数说明:
绘制圆形——cv.circle(img,centerpoint,r,color,thickness)
API:
cv.circle(img,centerpoint,r,color,thickness)
参数说明:
绘制矩形——cv.rectangle(img,lefttupper,righttupper,color,thickness)
API:
cv.rectangle(img,lefttupper,righttupper,color,thickness)
参数说明:
在图像中添加文字——cv.putText(img,text,font,fontsize,color,thickness,cv.LINE_AA)
API:
cv.putText(img,text,font,fontsize,color,thickness,cv.LINE_AA)
参数说明:
获取并修改图像中某个像素点的值:
方法:
获取图像的信息:
示例:
图像通道的拆分与合并:
只想获取一个图片单个通道的数据或者想把已有的三个通道数据合成一张彩色图片:
色彩空间转换(如灰度图转彩色):
联合基本操作程序:从摄像头获取一帧图像并进行图像基本操作
代码示例:
from picamera2 import Picamera2
import time
import numpy as np
import cv2 as cv
# 初始化相机
picam2 = Picamera2()
# 配置预览
camera_config = picam2.create_preview_configuration()
# 应用配置
picam2.configure(camera_config)
# 启动相机
picam2.start()
# 等待2秒以确保相机启动
time.sleep(2)
# 照片捕获
picam2.capture_file("../Photo_lib/Photo1.jpg")
# 照片处理
# 读取图片
img = cv.imread("/home/ThePun/Python_WS/Photo_lib/Photo1.jpg")
# 获取图片的形状
img_h = img.shape[0] # 图片高度
img_w = img.shape[1] # 图片宽度
# 设置画线的颜色和粗细
img_color = (255, 0, 0) # 红色
img_thickness = 5
#绘制直线
line_s = ((int)(img_h/2),(int)(img_w/2))
line_e = ((int)(img_h-1),(int)(img_w-1))
cv.line(img,line_s,line_e,img_color,img_thickness)
#绘制矩形
leftupper = ((int)(img_h/2)-50,(int)(img_w/2)-50)
rightdown = ((int)(img_h-1)-50,(int)(img_w-1)-50)
cv.rectangle(img,leftupper,rightdown,img_color,img_thickness)
#绘制圆形
r = 20;
centerpoint = tuple([int(img_h/2),int(img_w/2)])
cv.circle(img,centerpoint,r,img_color,img_thickness)
#显示图片
cv.imshow('image',img)
cv.waitKey(0)