树莓派4B_OpenCv学习笔记4:测试摄像头_imread加载显示图像_imwrite保存图片

news2024/12/23 13:42:39

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi)

 本人所用树莓派4B 装载的系统与版本如下:

 版本可用命令 (lsb_release -a) 查询:

Opencv 版本是4.5.1:

今日对之前的测试CSI摄像头函数进行一些理解说明,

然后就尝试使用 imread 方法读取照片,imwrite方法保存图片

目录

imread加载显示图像:

编写程序:

运行程序与结果:

imread('Path',flag)函数详解:

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 值及其具体意义:

  1. IMREAD_UNCHANGED (-1):
    • 如果设置,返回加载的图像原样(如果有 alpha 通道,则保留;否则,会裁剪)。
  2. IMREAD_GRAYSCALE (0):
    • 如果设置,始终将图像转换为灰度图像并返回。
  3. IMREAD_COLOR (1):
    • 如果设置,返回彩色图像。这是默认参数,图像的透明度会被忽略。
  4. IMREAD_ANYDEPTH (2):
    • 如果设置,并且载入的图像深度为 16 或 32 位,则返回对应深度的图像;否则,转换为 8 位图像再返回。
  5. IMREAD_ANYCOLOR (4):
    • 这个标志的具体作用在参考文章中未明确说明,但在某些上下文中,它可能与颜色空间的读取方式有关。
  6. IMREAD_LOAD_GDAL (8):
    • 如果设置,使用 GDAL 驱动程序加载图像。GDAL 是一个用于栅格地理空间数据格式的库。
  7. IMREAD_REDUCED_GRAYSCALE_2 (16):
    • 如果设置,返回 1/2 大小的灰度图像。
  8. IMREAD_REDUCED_COLOR_2 (17):
    • 如果设置,返回 1/2 大小的彩色图像。
  9. IMREAD_REDUCED_GRAYSCALE_4 (32):
    • 如果设置,返回 1/4 大小的灰度图像。
  10. IMREAD_REDUCED_COLOR_4 (33):
    • 如果设置,返回 1/4 大小的彩色图像。
  11. IMREAD_REDUCED_GRAYSCALE_8 (64):
    • 如果设置,返回 1/8 大小的灰度图像。
  12. IMREAD_REDUCED_COLOR_8 (65):
    • 如果设置,返回 1/8 大小的彩色图像。
  13. 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’就保存一张图片并进行了终端提示:

网上学习网址贴出:

3-3 如何通过OpenCV加载显示图片_哔哩哔哩_bilibili

3-5 如何通过OpenCV保存文件_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1796570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

混合关键性系统技术【同构异构】【SMP、AMP、BMP】【嵌入式虚拟化】

混合关键性系统技术【同构异构】【SMP、AMP、BMP】【嵌入式虚拟化】 1 介绍1.1 概述openEuler Embedded 的运行模式openEuler Embedded 混合关键性系统技术架构UniProton 1.2 同构异构区别 【硬件侧】1.3 系统架构【SMP、AMP、BMP】多核处理器平台的系统架构 【软件侧】【SMP、…

【RuoYi】框架中使用wangdietor富文本编辑器

一、前言 在上篇博客中&#xff0c;介绍了RuoYi中如何实现文件的上传与下载&#xff0c;那么这篇博客讲一下如何在RuoYi中使用富文本编辑器&#xff0c;这部分的内容是向&#xff22;站程序员青戈学习的&#xff0c;当然我这里就会把学到的内容做一个总结&#xff0c;当然也会说…

Java基础语法---集合---ArrayList

ArrayList是什么 ArrayList可以看作是一个动态数组&#xff0c;提供了自动扩容的能力&#xff0c;意味着它能够根据需要自动调整其大小以容纳更多的元素&#xff0c;而无需预先指定数组的容量。 使用ArrayList需要加入包 import java.util.ArryList ArrayList与普通数组的不同…

【C++】─篇文章带你熟练掌握 map 与 set 的使用

目录 一、关联式容器二、键值对三、pair3.1 pair的常用接口说明3.1.1 [无参构造函数](https://legacy.cplusplus.com/reference/utility/pair/pair/)3.1.2 [有参构造函数 / 拷贝构造函数](https://legacy.cplusplus.com/reference/utility/pair/pair/)3.1.3 [有参构造函数](htt…

bootstrap5-学习笔记1-容器+布局+按钮+工具

参考&#xff1a; Bootstrap5 教程 | 菜鸟教程 https://www.runoob.com/bootstrap5/bootstrap5-tutorial.html Spacing Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网 https://v5.bootcss.com/docs/utilities/spacing/ 之前用bootstrap2和3比较多&#xff0c;最近用到了5&a…

【FAS】《Liveness Detection on Face Anti-spoofing》

文章目录 原文总结与评价CNN-RNN vs 三维卷积作者的方法 原文 [1]欧阳文汉.反人脸图像欺诈的活体识别方法研究[D].浙江大学,2020.DOI:10.27461/d.cnki.gzjdx.2020.002675. 总结与评价 时序运动信息与传统的空间纹理信息相结合 基于相位平移的运动放大算法不错 视觉大小细胞…

每日一题《leetcode--LCR 029.循环有序列表的插入》

https://leetcode.cn/problems/4ueAj6/ 这道题整体上想插入数据有三种情况&#xff1a; 1、整个列表是空列表&#xff0c;需要返回插入的结点 2、整个列表只有一个结点&#xff0c;需要在头结点后插入新结点&#xff0c;随机把新结点的next指向头结点 3、整个列表的结点 >1 …

关于飞速(FS)800G光模块的技术问答

随着云计算、物联网&#xff08;IoT&#xff09;和大数据等技术的快速发展&#xff0c;对网络带宽和传输速率的需求越来越大。飞速&#xff08;FS&#xff09;800G光模块的引入旨在满足对高速数据传输的需求&#xff0c;该光模块采用先进的调制解调技术和高密度光电子元件&…

STM32F103VE和STM32F407VE的引脚布局

STM32F103VE vs STM32F407VE 引脚对比表 引脚 STM32F103VE STM32F407VE 备注 1 VSS VSS 地 2 VDD VDD 电源 3 VSSA VSSA 模拟地 4 VDDA VDDA 模拟电源 5 OSC_IN OSC_IN 外部时钟输入 6 OSC_OUT OSC_OUT 外部时钟输出 7 NRST NRST 复位 8 PC13 (GPIO) PC13 (GPIO) GPIO 9 PC14 (…

鸿蒙全栈开发-一文读懂鸿蒙同模块不同模块下的UIAbility跳转详解

前言 根据第三方机构Counterpoint数据&#xff0c;截至2023年三季度末&#xff0c;HarmonyOS在中国智能手机操作系统的市场份额已经提升至13%。短短四年的时间&#xff0c;HarmonyOS就成长为仅次于安卓、苹果iOS的全球第三大操作系统。 因此&#xff0c;对于鸿蒙生态建设而言&a…

依赖注入方式和自动加载原理

依赖注入 Spring提供了依赖注入的功能&#xff0c;方便我们管理和使用各种Bean&#xff0c;常见的方式有&#xff1a; 字段注入&#xff08;Autowired 或 Resource&#xff09;构造函数注入set方法注入 在以往代码中&#xff0c;我们经常利用Spring提供的Autowired注解来实现…

C语言操作UTF-8编码和GBK编码的文件的示例

一、基本介绍 在C语言中&#xff0c;处理文件编码&#xff08;如UTF-8或GBK&#xff09;时&#xff0c;需要注意C标准库中的文件操作函数&#xff08;如fopen, fread, fwrite, fclose等&#xff09;并不直接支持Unicode或特定字符集的编码。这些函数通常处理字节流&#xff0c…

FreeRTOS基础(十一):消息队列

本文将详细全方位的讲解FreeRTOS的消息队列&#xff0c;其实在FreeRTOS中消息队列的重要性也不言而喻&#xff0c;与FreeRTOS任务调度同等重要&#xff0c;因为后面的各种信号量基本都是基于消息队列的。 目录 一、消息队列的简介 1.1 产生的原因 1.2 消息队列的解决办法 …

防病毒克星——白名单可信系统

白名单作为一种网络安全措施&#xff0c;其核心概念在于限制用户只能访问网络所有者定义的受信任内容。这种机制在保护系统免受恶意软件、病毒等攻击方面发挥着重要作用。然而&#xff0c;关于白名单是否可以防病毒的问题&#xff0c;实际上涉及了多个方面的考虑。 首先&#x…

B=2W,奈奎斯特极限定理详解

一直没搞明白奈奎斯特极限定理的含义&#xff0c;网上搜了很久也没得到答案。最近深思几天后&#xff0c;终于有了点心得。顺便吐槽一下&#xff0c;csdn的提问栏目&#xff0c;有很多人用chatgpt秒回这个事&#xff0c;实在是解决不了问题&#xff0c;有时候人的问题大多数都是…

台式机安装Windows 11和Ubuntu 22双系统引导问题

一、基本情况 1.1、硬件情况 电脑有2个NVMe固态硬盘&#xff0c;1个SATA固态硬盘&#xff0c;1个机械硬盘。其中一个NVMe固态硬盘是Windows系统盘&#xff0c;另一个NVMe固态为Windows软件和文件盘&#xff0c;SATA固态硬盘为Ubuntu专用&#xff0c;机械硬盘为数据备份盘。 …

Java | Leetcode Java题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; class Solution {public int singleNumber(int[] nums) {int single 0;for (int num : nums) {single ^ num;}return single;} }

Ubuntu下安装和配置Redis

目录 1、更新软件包 2、安装Redis 3、启动 Redis临时服务 4、测试Redis服务 5、配置redis服务 6、Redis服务控制命令 1、更新软件包 执行sudo apt-get update更新软件包 sudo apt-get update2、安装Redis 执行sudo apt-get install redis-server 安装命令 sudo apt i…

CLion配置

下载环境&#xff1a;MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 解压后找一个位置存放&#xff0c;一般放在和ide同一目录&#xff0c;方便查找 个人习惯配置调整&#xff1a; 项目创建 修改ide解码形式 项目右下角一般默认是utf8 文件编码改…

【C++题解】1074 - 小青蛙回来了

问题&#xff1a;1074 - 小青蛙回来了 类型&#xff1a;需要找规律的循环 题目描述&#xff1a; 关于小青蛙爬井的故事&#xff0c;你应该早就听过了&#xff1a;井深10 尺&#xff0c;小青蛙从井底向上爬&#xff0c;每个白天向上爬 3 尺&#xff0c;每个晚上又滑下来 2 尺&…