OpenCV-python下载安装和基本操作

文章目录

  • 一、实验目的
  • 二、实验内容
  • 三、实验过程
    • OpenCV-python的安装与配置
      • python下载和环境配置
      • PIP镜像
      • 安装Numpy
      • 安装openCV-python
      • 检验opencv安装是否成功
    • openCV-python的基本操作
      • 图像输入和展示以及写出
      • openCV界面编程
      • 单窗口显示多图片
      • 鼠标事件
      • 键盘事件
      • 滑动条事件
  • 四、实验结果
  • 五、实验总结

一、实验目的

本实验目的是学习如何使用opencv库来读取文件并显示图象,学习opencv中的基本事件——窗口事件,鼠标事件、键盘事件以及滑动条事件,同时熟悉OpenCV库的函数和方法,为进一步学习和应用计算机视觉和图像处理提供基础。

二、实验内容

1、opencv的安装

2、opencv的基本操作 - 图像输入输出模块:通过cv2.imread()函数读取图像文件,并使用cv2.imshow()函数显示图像。使用cv2.waitKey()等待按键响应,然后使用cv2.destroyAllWindows()关闭窗口。使用shape属性获取图像的形状(高度、宽度)。使用cv2.imwrite()函数将图像保存到指定的文件中。 - opencv界面编程:界面编程主要由High-level GUI模块支持。 - 单窗口显示多图片:使用hstack函数实现单窗口显示多幅图像。 - 销毁窗口:使用destroyWindow和destroyAllWindows来销毁窗口,前者为销毁某一个制定名称的窗口,后者为销毁所有的窗口。 - 鼠标事件:我们使用鼠标事件来实现与用户的交互操作,有鼠标点击事件、鼠标移动事件、鼠标释放事件等。 - 键盘事件:键盘事件由waitKey函数实现。 - 滑动条事件:使用cv2.createTrackbar()函数创建一个滑动条,并指定滑动条的名称、所属窗口、数值范围和初始值等参数。定义一个滑动条事件的回调函数,并将其与窗口绑定。在滑动条事件回调函数中,根据滑动条的数值变化对图像进行实时更新和显示。

三、实验过程

OpenCV-python的安装与配置

python下载和环境配置

1.前往python官网进行对应版本的下载

在这里插入图片描述

2.下载完成打开程序进行配置,点击Install Now 也可以进行安装目录的更改

在这里插入图片描述

3.检测安装成果,打开命令行窗口,输入pyhthon

如果显示如下图就安装配置成功

在这里插入图片描述

PIP镜像

再命令行窗口分别运行以下两行代码,如下图

第一行是更新pip

第二行是把pip对应的国外网站改为镜像国内的,提高下载速度 python -m pip install --upgrade pip pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

在这里插入图片描述

安装Numpy

打开命令行输入 pip install numpy

来下载Numpy包,如图(不更改pip镜像会很慢)
在这里插入图片描述

安装openCV-python

命令行运行 pip install opencv-python

如图
在这里插入图片描述

再安装一下openCV的扩展包,后面接版本号,和我们安装openCV版本一致即可 pip install opencv-contrib-python4.8.0.76

再安装一个可视化库 pip install matplotlib

在这里插入图片描述

检验opencv安装是否成功

命令行先输入python

然后导入一下包 import cv2

再检查一下版本 cv2.version

如果能正常显示版本就是安装成功,然后exit()退出即可

openCV-python的基本操作

图像输入和展示以及写出

    # 读取图像文件
    src_image = cv2.imread('bird.jpg', cv2.IMREAD_COLOR)
    gray_image = cv2.imread('bird.jpg', cv2.IMREAD_GRAYSCALE)
    cv2.imshow("src_image", src_image)
    print(src_image.shape)
    cv2.waitKey(0)
    
    # 写入图像文件
    cv2.imwrite('gray_image.jpg', gray_image)

效果展示

图像写入和展示

在这里插入图片描述

灰度图像的写入

在这里插入图片描述

openCV界面编程

    OpenCV界面编程 
    img = cv2.imread('image.jpg') 
    cv2.imshow("mying", img) 
    cv2.waitKey(0)

效果展示

对应图片会出现在以mying命名的窗口中

在这里插入图片描述

单窗口显示多图片

    # 单窗口显示多图片
    
    def opencv_muti_pic():
        img1 = cv2.imread('1.jpg')
        print(img1.shape)
        img2 = cv2.imread('1.jpg')
        print(img2.shape)
        img3 = cv2.imread('1.jpg')
        print(img3.shape)
        imgs = np.hstack([img1, img2, img3])
        # 展示多个
        cv2.imshow('mutil_pic', imgs)
        # 等待关闭
        cv2.waitKey(0)
    
    
    opencv_muti_pic()

效果展示

在这里插入图片描述

鼠标事件

    鼠标事件 # 回调函数,用于处理鼠标事件 
    def mouse_callback(event, x, y, flags, param): 
        if event == cv2.EVENT_MOUSEMOVE: # 鼠标移动事件 
            print('Mouse moved at (%d, %d)' % (x, y)) 
        elif event == cv2.EVENT_LBUTTONDOWN: # 鼠标左键按下事件 
            print('Left button down at (%d, %d)' % (x, y)) 
        elif event == cv2.EVENT_RBUTTONDOWN: # 鼠标右键按下事件 
            print('Right button down at (%d, %d)' % (x, y)) 
        elif event == cv2.EVENT_MBUTTONDOWN: # 鼠标中键按下事件
            print('Middle button down at (%d, %d)' % (x, y)) 
        elif event == cv2.EVENT_LBUTTONUP: # 鼠标左键释放事件 
            print('Left button up at (%d, %d)' % (x, y)) 
        elif event == cv2.EVENT_RBUTTONUP: # 鼠标右键释放事件 
            print('Right button up at (%d, %d)' % (x, y)) 
        elif event == cv2.EVENT_MBUTTONUP: # 鼠标中键释放事件 
            print('Middle button up at (%d, %d)' % (x, y))
        elif event == cv2.EVENT_LBUTTONDBLCLK: # 鼠标左键双击事件 
            print('Left button double-clicked at (%d, %d)' % (x, y)) 
        elif event == cv2.EVENT_RBUTTONDBLCLK: # 鼠标右键双击事件 
            print('Right button double-clicked at (%d, %d)' % (x, y)) 
        elif event == cv2.EVENT_MBUTTONDBLCLK: # 鼠标中键双击事件 
            print('Middle button double-clicked at (%d, %d)' % (x, y))
    # 创建一个名为 "image" 的窗口
    cv2.namedWindow('image')
    # 读取图像
    img = cv2.imread('image.jpg')
    # 在窗口中显示图像
    cv2.imshow('image', src_image)
    # 设置鼠标回调函数
    cv2.setMouseCallback('image', mouse_callback)
    cv2.waitKey(0)
    # 关闭窗口
    cv2.destroyAllWindows()

效果展示

在这里插入图片描述

对应输出结果会随鼠标指针在图像上的位置而变化
在这里插入图片描述

键盘事件

    # 键盘事件 
    img7 = numpy.zeros((100, 200)) 
    cv2.imshow("windowname", img7 
    key1 = cv2.waitKey(0) # 任意按键按下,图片显示结束,返回按键键值 
    print("按下的键值:", key1) 
    cv2.imshow("windowname2", img7) 
    key2 = cv2.waitKey(5000) # 任意按键按下,图片显示结束,返回按键键值 
    print("按下的键值:", key2) 
    cv2.destroyAllWindows()

效果展示

键盘事件

输入q的情况,会返回对应的q的ASCII码值

在这里插入图片描述

第二个窗口长期不按会显示-1的返回结果

在这里插入图片描述

滑动条事件

    滑动条事件
        # 回调函数,用于处理滑动条变化事件
        def TrackbarCallback(value):
            print('Trackbar value is: %d' % value)
    
    
        # 创建一个名为 "image" 的窗口
        cv2.namedWindow('image')
        # 读取图像
        img = cv2.imread('image.jpg')
        # 在窗口中显示图像
        cv2.imshow('image', img)
        # 创建一个名为 "slider" 的滑动条
        cv2.createTrackbar('slider', 'image', 0, 100, TrackbarCallback)
        # 获取滑动条的当前值
        slider_value = cv2.getTrackbarPos('slider', 'image')
        print('Initial slider value: %d' % slider_value)
        # 设置滑动条的值
        cv2.setTrackbarPos('slider', 'image', 50)
        # 循环等待键盘输入
        while True:
            key = cv2.waitKey(10)
            if key == ord('q'):
                break
        # 关闭窗口
        cv2.destroyAllWindows()

效果展示
在这里插入图片描述
通过鼠标滑动图片上方的滑动条可以再控制台动态的输出滑动条信息

在这里插入图片描述

四、实验结果

实验结果已经在实验过程中写出,实验结果的所有截图均可在实验过程中查看,这里不做过多展示

五、实验总结

通过本次实验,我对以下知识有了更好的掌握:文件读取和图像显示:学习如何使用OpenCV库来读取图像文件并在窗口中显示图像,这是图像处理的基础操作。窗口事件:了解如何处理窗口事件,比如窗口的关闭事件,以确保图像显示过程中的交互性和稳定性。鼠标事件:学习如何捕获和处理鼠标事件,比如点击、移动和拖拽等,为图像标记、交互式测量等功能的实现奠定基础。键盘事件:掌握如何处理键盘事件,比如按键响应和组合操作,为实现键盘控制的图像处理流程打下基础。滑动条事件:了解如何创建和使用滑动条,实现图像处理参数的实时调整和交互式控制。为进一步学习和应用计算机视觉和图像处理奠定基础。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

科研神器:Vscode + latex+grammarly+github copilot

科研论文编写神器:Vscode latex grammarly github copilot 相信很多科研人都有使用latex排版及撰写论文的需求,我一开始使用的是在线编辑的overleaf,overleaf的优点是省事便捷,不用配置,并且支持版本回溯&#xff…

一对一互相聊天

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector;…

换种方式开发软件

前 言 作为程序员,经常苦于项目交付,疲于应对各种需求,一路狂奔,很难有时间停下来思考与抽象,聊起来都是“累”;作为产品经理,最痛苦的莫过于梦醒之后无路可走,心里的苦只有自己知道…

【精】云HIS系统操作过程中常见问题及解决方法

云HIS系统使用和操作过程中常见问题及解决方法 1.门诊业务 (1)门诊医生如何查询往期病人? 答:点击门诊医生站左侧患者列表,在弹出的页面点击已诊分页,在搜索框输入患者姓名,在结果中找到对应…

【2021研电赛】基于EAIDK-310的云端互联无人驾驶系统

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力,更有重磅电子产品免费领取! 参赛单位:上海理工大学 参赛队伍:你说的都是对的 指导老师:蒋全 参赛队员:童锐,邹祖奇,胡涛 获奖情况&…

亚马逊云科技re:Invent大会:RAG技术赋能企业AI应用的新纪元

在最新一届re:Invent大会中,亚马逊云科技的数据和人工智能副总裁Swami Sivasubramanian博士提出了一系列AI产品,其中RAG技术成为了企业构建生成式AI应用的重要选择。这种技术的实质是将向量数据库与大语言模型相结合,赋予大模型记忆的能力&am…

【译】虚拟线程:绝对优势

原文地址:Virtual Threads: A Definite Advantage 一、前言 深入了解虚拟线程如何提高应用程序的性能和可扩展性,同时将线程管理开销降到最低。 探索虚拟线程是一件很棒的事情,它是 Java 的一项强大功能,有望彻底改变多线程应用…

【星戈瑞】Sulfo-CY3 DBCO荧光光谱特性之吸收、发射光谱

Sulfo-CY3 DBCO的荧光光谱特性通常涵盖了其吸收和发射光谱。这些光谱特性是研究该染料在生物分子标记和成像中的应用时的参数。 吸收光谱: Sulfo-CY3 DBCO的吸收光谱通常显示了其在不同波长下吸收光的能力。典型情况下,Sulfo-CY3 DBCO的吸收峰位于可见光…

单向通信----一对一聊天

package 一对一聊天; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import …

CRM客户关系管理系统的主要功能有哪些?

我们都知道,CRM系统可以帮助企业加快业务增长。如果一个企业能提高业务效率、跨团队协作、有效管理客户、轻松共享和同步数据,那么企业竞争力将极大地提高。基于此,我们说说CRM客户关系管理系统的主要功能分析。 完整的CRM是什么样的&#x…

HarmonyOS开发(十):通知

1、通知概述 1.1、简介 应用可以通过通知接口发送通知消息,终端用户可以通过通知栏查看通知内容,也可以点击通知来打开应用。 通知使用的的常见场景: 显示接收到的短消息、即使消息...显示应用推送消息显示当前正在进行的事件&#xff0c…

最常见的直流负载工作方式

直流负载工作方式是指在电力系统中,直流电源为负载提供电能的方式。在实际应用中,直流负载工作方式有很多种。 直接供电方式:这是最简单的直流负载工作方式,即直流电源直接为负载提供电能。这种方式适用于负载较小、对电源稳定性要…

【Vue第1章】Vue核心

目录 1.1 Vue简介 1.2 初识Vue 1.2.1 代码 1.3 模板语法 1.3.1 效果 1.3.2 模板的理解 1.3.3 插值语法 1.3.4 指令语法 1.3.5 代码 1.4 数据绑定 1.4.1 效果 1.4.2 单向数据绑定 1.4.3 双向数据绑定 1.4.4 代码 el与data的两种写法 代码 1.5 MVVM模型 1.5.1 …

Java基础-代码块及其细节

代码块概念: 注意调用时机 好处与使用场景 将构造器的冗余部分提取到代码块 每个构造器执行时都会先执行代码块 静态代码块与普通代码块的区别 注意:创建对象实例时,静态代码块只会被调用一次 例子 public Class DD{static{//打印"…

Qt开发学习笔记02

将窗口设为提示框 Qt::ToolTipQt 数据库连接池 #ifndef SQLITE_H #define SQLITE_H#include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> #include <QQueue> #include <QMutex> #include <QDebug> #include "../con…

翻译: 生成式人工智能的经济潜力 第一部分商业价值 The economic potential of generative AI

生成式人工智能即将引发下一波生产力的浪潮。我们首先看看业务价值可能会增加的地方&#xff0c;以及对劳动力的潜在影响。 1. 人工智能已经逐渐渗透到我们的生活中 人工智能已经逐渐渗透到我们的生活中&#xff0c;从为智能手机提供动力的技术到汽车上的自动驾驶功能&#x…

实现简易的多人聊天

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

SpringBoot Maven打包插件spring-boot-maven-plugin无法解析离谱原因记录

目录 一、常见打包插件无法解析原因二、打包插件无法解析离谱原因三、总结 打包配置 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><…

基于深度学习路径规划RRT*-训练图像预处理

基于深度学习路径规划RRT*-训练图像预处理 图像预处理说明 在基于采样的RRT算法对机器人进行路径规划时&#xff0c;由于采样点的随机性&#xff0c;会增加路径的搜索时间的路径的非最优性&#xff0c;所以基于神经网络的优势&#xff0c;利用深度学习进行RRT的随机采样&…

M2芯片回顾

M芯片&#xff0c; 一竟到底&#xff1a; M1芯片的体积&#xff1a; M2 代表 M 系列芯片的第二代&#xff1a; 其进一步提升了芯片的性能和功率 &#xff0c;这也是 M 芯片目前的追求&#xff1a;最大化性能的同时&#xff0c;最大限度降低功耗。 UMA 统一内存架构被再一次提到…