今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi)
本人所用树莓派4B 装载的系统与版本如下:
版本可用命令 (lsb_release -a) 查询:
Opencv 版本是4.5.1:
今日对之前的测试CSI摄像头函数进行一些理解说明,
然后就尝试使用 imread 方法读取照片,imwrite方法保存图片
目录
imread加载显示图像:
编写程序:
编写一个文件名为“Load_img.py”的python程序如下:
# coding=utf-8 import cv2 # 创建一个窗口,并允许调整窗口大小 cv2.namedWindow('image', cv2.WINDOW_NORMAL) # 读取图片,第二个参数0表示以灰度并以1/4大小模式读取 img = cv2.imread('/home/pi/Pictures/Load_test.jpg', 33) # 如果图片读取成功,则显示图片 if img is not None: cv2.imshow('image', img) # 等待任意按键按下 key = cv2.waitKey(0) # 如果按下的是'q'键,则退出程序 if key & 0xFF == ord('q'): cv2.destroyAllWindows() else: print("Load_Failed...") # 无论是否按下'q'键,都需要在程序结束前销毁窗口 # 但由于我们在上面的if块中已经销毁了窗口(如果按下'q'),这里不需要再次销毁 # 如果上面的if块没有执行(即图片未加载),则这里也不需要销毁窗口 # 因为没有窗口被创建
在读取图片代码处需要注意文件路径以及图片类型名称:
代码中我是加载了位于/home/pi/Pictures/ 目录下的 Load_test.jpg 图片:
这个可以自己随便拍张图片放在指定目录来测试,目录与图片名称填完整正确了就可以
其次就是文件头的这个注释不可去除:
程序包含了一些非UTF-8编码的字符,这是Python解释器在读取文件时声明文件编码的注释
运行程序与结果:
使用
dos2unix
工具:程序包含了一些非UTF-8编码的字符所以需要用工具进行一些转换:
如果未安装:
sudo apt-get update sudo apt-get install dos2unix
如果安装过了:
dos2unix <文件名>.py
运行结果:
python3 Load_img.py
imread('Path',flag)函数详解:
以下是
imread
函数中常用的枚举flag
值及其具体意义:
- IMREAD_UNCHANGED (-1):
- 如果设置,返回加载的图像原样(如果有 alpha 通道,则保留;否则,会裁剪)。
- IMREAD_GRAYSCALE (0):
- 如果设置,始终将图像转换为灰度图像并返回。
- IMREAD_COLOR (1):
- 如果设置,返回彩色图像。这是默认参数,图像的透明度会被忽略。
- IMREAD_ANYDEPTH (2):
- 如果设置,并且载入的图像深度为 16 或 32 位,则返回对应深度的图像;否则,转换为 8 位图像再返回。
- IMREAD_ANYCOLOR (4):
- 这个标志的具体作用在参考文章中未明确说明,但在某些上下文中,它可能与颜色空间的读取方式有关。
- IMREAD_LOAD_GDAL (8):
- 如果设置,使用 GDAL 驱动程序加载图像。GDAL 是一个用于栅格地理空间数据格式的库。
- IMREAD_REDUCED_GRAYSCALE_2 (16):
- 如果设置,返回 1/2 大小的灰度图像。
- IMREAD_REDUCED_COLOR_2 (17):
- 如果设置,返回 1/2 大小的彩色图像。
- IMREAD_REDUCED_GRAYSCALE_4 (32):
- 如果设置,返回 1/4 大小的灰度图像。
- IMREAD_REDUCED_COLOR_4 (33):
- 如果设置,返回 1/4 大小的彩色图像。
- IMREAD_REDUCED_GRAYSCALE_8 (64):
- 如果设置,返回 1/8 大小的灰度图像。
- IMREAD_REDUCED_COLOR_8 (65):
- 如果设置,返回 1/8 大小的彩色图像。
- IMREAD_IGNORE_ORIENTATION (128):
- 如果设置,在读取图像时忽略 EXIF 中的方向信息。
imwrite方法保存图片:
编写程序:
这个程序可以做到打开摄像头,实时显示捕获视频流,
按下键盘‘C’可以截获保存一张照片在路径‘/home/pi/Pictures/’(注意要有这个文件夹Pictures),图片名称为‘your_image_0000.jpg’(0000是图片编号;会递增)
按下键盘‘Q’键就能退出这个程序了
# coding=utf-8 import cv2 # 打开摄像头,0通常是默认摄像头的索引 cap = cv2.VideoCapture(0) if not cap.isOpened(): print("Error opening video stream or file") else: frame_count = 0 # 初始化帧计数器 while True: # 读取一帧图像 ret, frame = cap.read() # 检查帧是否正确读取 if not ret: print("Can't receive frame (stream end?). Exiting ...") break # 显示图像 cv2.imshow('Video Stream', frame) # 等待键盘输入,如果按下'q'则退出循环 key = cv2.waitKey(1) & 0xFF if key == ord('q'): break # 如果按下'c',则保存当前帧 elif key == ord('c'): # 定义保存图片的文件路径和名称,包含递增的编号 # 使用04d来确保编号是四位数,并填充前导零 file_path = f'/home/pi/Pictures/your_image_{frame_count:04d}.jpg' cv2.imwrite(file_path, frame) print(f"Image saved successfully: {file_path}") frame_count += 1 # 递增计数器 # 释放摄像头 cap.release() # 关闭所有OpenCV窗口 cv2.destroyAllWindows()
运行程序与结果:
发现确实每次按下‘C’就保存一张图片并进行了终端提示: