OpenCV入门-基于Python

news2024/11/27 1:29:03

图像入门

  • 1. 创建窗口
    • namedWindow()
    • resizeWindow()
    • destroyAllWindow()
  • 2.显示图像
    • imread()
    • imshow()
    • imwrite()
    • waitKey()
    • flip()
  • 代码演示
  • 3.显示视频
    • VideoCapure()对象
      • cap.get()
      • cap.isOpened()
      • cap.read()
      • cap.release()
  • 部分功能代码演示
    • VideoWriter()对象
      • VideoWriter_fourcc()
      • write()
      • release()
      • 部分代码展示:
  • 4.鼠标控制
    • setMouseCallBack()
    • callback()
    • 部分代码展示:
  • 5. trackBar组件
    • createTrackbar()
    • getTrackbarPos()
    • 部分代码示例
  • 6. 图像的基本操作
    • cvtColor()
    • 部分代码展示:

在这里插入图片描述

1. 创建窗口

进行图像操作时,我们要用窗口来显示对图像所进行的操作。用窗口来观察操作前后的效果。

namedWindow()

创建一个新窗口
cv2.namedWindow(winname,图像格式)
winname:创建的窗口名字
图像格式:WINDOW_NORMAL :可以改变窗口大小。WINDOW_AUTOSIZE:自动适应窗口大小,不能自己改变窗口大小。

resizeWindow()

修改窗口大小
cv2.resizeWindow(winname,width,height)
winname:修改的窗口名字
width:宽
height:高

destroyAllWindow()

销毁所有窗口无参数。
cv2.destroyAllWindow()
销毁指定窗口,参数为窗口名。
cv2.destroyWindow(winname)

2.显示图像

在窗口创建好之后,我们就可以通过窗口,把图像显示出来。

imread()

读取指定路径的图像
cv2.imread(path,flag=cv2.IMREAD_COLOR)
path:读取文件的路径
flag:读取图像的方式。cv2.IMREAD_COLOR(加载彩色图像,默认标志 ) 、cv2.IMREAD_GRAYSCALE(灰度模式加载图像)、cv2.IMREAD_UNCHANGED:加载图像,包括alpha通道。
这三种标志可分别用1、0、-1代替。
返回值为mat

imshow()

在窗口中显示图像
cv2.imshow(winname,mat)
指定winname窗口,显示mat对象。

imwrite()

将图像保存起来
cv2.imwrie(path,mat)
path:保存图像的路径
mat:将要保存图像的信息。

waitKey()

窗口显示时间(让窗口等一下,我要输入数据)
cv2.waitKey(time)
time:窗口等待的时间,单位ms,time=0,那么一直等待输入数据。
返回值 用户从键盘输入的ASCII码值。

flip()

将图像进行垂直,水平翻折
cv2.flip(mat,-1/0/1)
mat:就是进行翻折的图片帧
-1:x+y轴翻折、0:x轴翻折、1:y轴翻折
返回值 是翻折之后的图片

代码演示

import cv2
'''
前面代码统一演示示例:
'''
#创建窗口
cv2.namedWindow('flower',cv2.WINDOW_NORMAL)
#修改窗口大小
cv2.resizeWindow('flower', 640, 480)
# 彩色方式读取图片文件,用img来接收
img = cv2.imread('./image/girl.png',1)
# 显示图像
cv2.imshow('flower',img)

# 保存图像
cv2.imwrite('./image/flower1.png', img)

# 一直显示,等待用户输入数据
cv2.waitKey(0)
# 销毁窗口
cv2.destroyWindow('flower')

3.显示视频

需要用到视频操作的相关接口,OpenCV提供了VideoCapure()对象,用来进行相关操作。

VideoCapure()对象

视频捕获的对象
cap = cv2.VIdeoCapure(path/数字01)
创建好后,cap就是一个视频操作的对象(以后都用cap来表示)
path:读取视频文件需要放视频文件的完整路径
数字0/1:0是默认电脑摄像头。

cap.get()

获得视频帧中的属性
cap.get(propld)
propld:3表示宽度,4表示高度,5表示帧率
返回值由输入的数据决定

cap.isOpened()

用来检查创建的对象,是否已经成功打开
cap.isOpened()
返回值是一个boll值,True表示成功打开,否则打开失败

cap.read()

从捕获的摄像头或者视频帧中读取视频帧。
cap.read()
两个返回值,第一个boll值,代表该帧是否正确读取到,第二个返回值是该帧的数据(mat)

cap.release()

释放cap对象捕获的设备
cap.release()

部分功能代码演示

import cv2

# 创建一个窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)

# 创建一个视频对象
cap = cv2.VideoCapture(0)
# 检查是否打开
if not cap.isOpened():
    print('Video opened failed')
    exit(-1)

# 获取视频帧的宽和高
print(cap.get(3))
print(cap.get(4))

while True:
    # 读取视频帧
    ret, frame = cap.read()
    if not ret:
        print('视频帧读取有误!')
        break
    # 显示视频帧
    cv2.imshow('video', frame)
    key = cv2.waitKey(10)
    # 按q退出,按s保存
    if (key & 0xff) == ord('q'):
        print('退出成功')
        break
# 释放资源
cv2.destroyAllWindows()
cap.release()

VideoWriter()对象

创建一个保存视频的对象,定义好path、编码格式、帧数、视频帧大小,是否是彩色格式(默认为彩色)
out = cv2.VideoWriter(filename,fourcc,fps,frameSize,[IsColor])
filename:视频的路径和文件名
fourcc:压缩帧的4字符编/解码器的选项
fps:视频的帧数
frameSize:视频帧的大小(width,height)

VideoWriter_fourcc()

用来设置编/解码器。
fourcc = cv2.VideoWriter_fourcc(*‘字符串’)
参数:适合编码的各种缩写,-1为自动匹配合适的编/解码器。

write()

先将视频帧编码,之后再将视频帧写入要保存的路径中
out.write(mat)
mat:保存的视频帧

release()

释放类,并且把缓冲区的数据强制编码,再输出成文件。
out.release()

部分代码展示:

读取视频仅仅需要将创建视频的对象,修改成读取的文件路径即可

import cv2

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# 创建一个窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
# 创建一个输出对象
out = cv2.VideoWriter('./video/out.mp4', fourcc, 20, (640, 480))
# 创建一个视频对象
cap = cv2.VideoCapture(0)
# 检查是否打开
if not cap.isOpened():
    print('Video opened failed')
    exit(-1)

# 获取视频帧的宽和高
print(cap.get(3))
print(cap.get(4))

while True:
    # 读取视频帧
    ret, frame = cap.read()
    if not ret:
        print('视频帧读取有误!')
        break
    # 将视频帧反转保存并显示视频帧
    frame = cv2.flip(frame, 1)
    out.write(frame)
    cv2.imshow('video', frame)
    key = cv2.waitKey(1000//20)
    # 按q退出
    if (key & 0xff) == ord('q'):
        print('退出成功')
        break
# 释放资源
cv2.destroyAllWindows()
out.release()
cap.release()

4.鼠标控制

可以在图像中控制鼠标来进行一些操作。

setMouseCallBack()

设置鼠标回调函数
cv2.setMouseCallBack(winname,callback,uerdata)
winname:在哪个窗口调用这个函数
callback:回调函数,需要用户自己设置,用来完成一些事件。
uerdata:用户自己额外传送的数据。

callback()

自己定义的一个函数
def callback(event,x,y,flags,uerdata)
event:鼠标进行的动作
flags:键盘进行的动作
(x,y):鼠标的横纵坐标
uerdata:调用这个函数的数据。

event:
在这里插入图片描述
flags:
在这里插入图片描述

部分代码展示:

import cv2
import numpy as np


def mouse_back(event, x, y, flags, uerdata):
    print(event, x, y, flags, uerdata)


# 创建窗口,并且调整大小
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 480)

# 设置鼠标回调
cv2.setMouseCallback('mouse',mouse_back,'1111')


#创建一个纯黑的图像,行数,列数,几个通道,图片格式
img = np.zeros((480, 640, 3), np.uint8)
while True:
    cv2.imshow('mouse',img)
    key = cv2.waitKey(10)
    if key & 0xFF == ord('q'):
        print('退出成功')
        break

# 销毁资源
cv2.destroyAllWindows()

5. trackBar组件

createTrackbar()

用于创建一个tarckbar,目的是进行调节量
cv2.createTrackbar(trackbarname,winname,value,count,callback,userdata)
trackbarname:轨道名称
winname:将该组件和winname绑定。
value:组件的当前值。
count:组件的最大值,从0开始算。
callback:回调函数
userdata:用户自己传的数据

getTrackbarPos()

用于获取trackbar的位置
cv2.getTrackbarPos(trackbarname,winname)
taackbainame:trackbar的控件名称
winname:控件绑定的窗口
返回值 trackbar的位置

部分代码示例

import cv2
import numpy as np

def track_callback():
    pass


# 创建一个窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)
# 创建一个全黑图像
img = np.zeros((480, 640, 3), np.uint8)
# 创建三个trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, track_callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, track_callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, track_callback)

while True:
    # 首先展示图片
    cv2.imshow('trackbar', img)
    # 获取三个trackbar的值
    r = cv2.getTrackbarPos('R', 'trackbar')
    g = cv2.getTrackbarPos('G', 'trackbar')
    b = cv2.getTrackbarPos('B', 'trackbar')
    key = cv2.waitKey(10)
    if key & 0xff == ord('q'):
        print("退出成功")
        break
    img[:] = [b, g, r]


# 释放资源
cv2.destroyAllWindows()

6. 图像的基本操作

cvtColor()

用于将图像从一个颜色空间转换为另一个颜色空间。
dst = cv2.cvtColor(src,flag)
src:需要转换的图像
flag:见下表
返回值dst,转换颜色空间后的图像

(flag)标志简记作用
cv2.COLOR_BGR2BGRA0为RGB图像添加alpha通道
cv2.COLOR_BGR2RGB4由BGR变成RGB顺序
cv2.COLOR_BGR2GRAY10将彩色图像变成灰度图像
cv2.COLOR_BGR2YUV82从RGB颜色空间转成YUV颜色空间
cv2.COLOR_BGR2HSV40从RGB颜色空间转成HSV颜色空间

部分代码展示:

import cv2

def callback(x):
    pass


# 创建窗口
cv2.namedWindow('color',cv2.WINDOW_NORMAL)
cv2.resizeWindow('color', 640, 480)

# 读取一个图像
img = cv2.imread('./image/girl.png')
# 创建一个列表
colorspaces = [cv2.COLOR_BGR2RGB, cv2.COLOR_BGR2BGRA, cv2.COLOR_BGR2GRAY,
               cv2.COLOR_BGR2YUV, cv2.COLOR_BGR2HSV]
# 创建一个trackbar
cv2.createTrackbar('cvt_color', 'color', 0, len(colorspaces)-1, callback)

while True:
    # 获取trackbar位置
    index = cv2.getTrackbarPos('cvt_color', 'color')
    # 转换图像
    cvt_img = cv2.cvtColor(img, colorspaces[index])
    cv2.imshow('color', cvt_img)
    key = cv2.waitKey(10)
    if key & 0xff == ord('q'):
        break
# 销毁资源
cv2.destroyAllWindows()

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

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

相关文章

K8s之Pod生命周期、启动停止钩子

文章目录 一、Pod生命周期流程二、初始化容器-initContainers三、主容器操作-containers1、启动钩子-lifecycle.postStart2、停止钩子-lifecycle.preStop 一、Pod生命周期流程 Pod生命周期整个过程 如下图: 1、在启动任何容器之前,前创建 pause 容器&am…

u-boot移植:详细讲解移植u-boot.2022.10版本到imx6ull开发板

目录 一、u-boot编译环境准备 1.安装交叉编译工具链 2.u-boot源码包下载 3.编译 4.安装依赖库 二、U-Boot中添加自己的开发板 1、添加开发板默认配置文件 2、添加开发板对应的头文件 3、添加开发板对应的板级文件夹 4、修改 arch/arm/mach-imx/mx6/Kconfig 5、其他需…

5分钟使用UNI-APP框架创建你的第一个项目

UNI-APP学习系列 5分钟使用UNI-APP框架创建你的第一个项目 文章目录 UNI-APP学习系列前言uni-app框架创建项目一、HBuilderX可视化方式二、 vue-cli命令行方式 总结 前言 UNI-APP学习系列之5分钟创建自己的第一个uni-app项目。 uni-app框架创建项目 创建方式 一、HBuilderX可…

bash: /opt/ros/kinetic/setup.bash: 没有那个文件或目录

有时候打开终端的时候,会在第一行报错: bash: /opt/ros/kinetic/setup.bash: 没有那个文件或目录 bash: /opt/ros/melodic/setup.bash: 没有那个文件或目录 bash: /opt/ros/neodic/setup.bash: 没有那个文件或目录 凡是类似报错与bash有关的&#xf…

【PCIE703】XCKU060+海思视频处理器HI3531DV200-ARM的高性能综合视频图像处理平台设计资料及调试经验

板卡概述 PCIE703是我司自主研制的一款基于PCIE总线架构的高性能综合视频图像处理平台,该平台采用Xilinx的高性能Kintex UltraScale系列FPGA加上华为海思的高性能视频处理器来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎&am…

架构-软件工程模块-2

系统分析 数据流图可能出案例题,状态转换图了解作用即可 用例图、类图选择题多,暴徒了解即可 #mermaid-svg-lGozbtkYJPEQF1eo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lGozbtkYJPEQF1e…

加密那些事

一、前言 说到加解密也许有些人会有些陌生(仅对于初学者或其他行业的学者),先不说那些让人看到千篇一律的概念,就是如果两个人发信息怎样才能不被第三个人知道呢?是不是脑海里冒出了使用某种暗号,只有相互传…

每一个“大佬级别”的测试工程师,都有着怎样的成长那个路线?3分钟为你揭晓谜底!

目录 引言 1.何为软件测试工程师? 2.软件测试工程师的职责? 3.为什么要做软件测试? 4.软件测试的前途如何? 5.工具和思维谁更重要? 6.测试和开发相差大吗? 7.成为测试工程师的必备条件 8.测试的分…

虚拟机栈概述

一、概述 1.1、虚拟机栈背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功…

网络分析和机器学习

文章目录 网络分析1.Introduction to networks and graph foundations and algorithmsNetwork types (social/bio/comp), Euler/Hamilton, Graphs (matrix/adj)Breadth-first search (shortest paths), Depth-first search (conn. compnts) 2. Emergent global / local network…

PS的基础操作

1、图片放大缩小alt鼠标滚轮 2、按住空格不放,拖拽鼠标可以改变图片的位置 3、英文状态下按字母t,再点击想要查看的文字,就可以在菜单栏上看到所有属性(取消选中按esc键) 4、点击它可以画选区来查看间距; w代表宽;h代表…

Jenkins版本升级

Jenkins版本过低的时候,一些插件无法升级,会引发一系列错误,这个时候我们就要升级版本了 一、下载更新包 第一种方式:Jenkins页面下载最新包 第二种官网上下载war包(Jenkins官网) 二、打开服务器搜索jenkins.war路径 1、如果Jenk…

CSDN 的 MD编辑器一些用法

一、点击关键语句跳转指定位置 在CSDN写文章的时候,写的文章过长往往会让读者很难找到自己想看的部分,这时候有个 跳转到指定位置功能 就非常的便利。CSDN在MD编辑器上(富文本编辑器只有一种)就提供了两种跳转到指定位置的方法: 一、目录转跳…

【SCADA】KingSCADA将数据插入SQLServer的方法

大家好,我是雷工! 本篇通过实例,介绍KingSCADA3.7访问SQL Server2022数据库。 一、概述 1、创建数据库及数据表格; 2、配置ODBC数据源。 3、通过KingSCADA与数据库建立连接,将数据写入数据库对应表格。 二、创建数据…

自动化测试与手工测试?你真的了解吗?如何共存...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

代码随想录算法训练营第二十七天|39. 组合总和 40.组合总和II131.分割回文串

文章目录 39. 组合总和思路代码总结 40.组合总和II思路代码总结 131.分割回文串思路代码总结 39. 组合总和 思路 我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:77.组合 ,216.组合总和III 。 如果是…

【AIGC使用教程】Microsoft Edge/Bing Chat 注册使用完全指南

欢迎关注【AIGC使用教程】 专栏 【AIGC使用教程】SciSpace 论文阅读神器 【AIGC使用教程】Microsoft Edge/Bing Chat 注册使用完全指南 【AIGC使用教程】GitHub Copilot 免费注册及在 VS Code 中的安装使用 【AIGC使用教程】GitHub Copilot 免费注册及在 PyCharm 中的安装使用 …

算法时间复杂度

参考视频&#xff1a;https://www.bilibili.com/video/BV14j411f7DJ 目录 1.常数阶O(1) 2.对数阶O(IogN) 3.线性阶O(n) 4.线性对数阶O(nlogN) 5.平方阶O(n^2) 6.立方阶O(n^3) 7.K次方阶O(n^k) 8.指数阶(2^n) 9.阶乘O(n!) 两层for循环 for (int i 1; i <…

有模型强化学习和免模型强化学习有什么区别?

有模型强化学习&#xff08;Model-Based Reinforcement Learning&#xff09;和无模型强化学习&#xff08;Model-Free Reinforcement Learning&#xff09;是两种不同的强化学习方法。 有模型强化学习是指&#xff0c;智能体在学习过程中能够对环境进行建模&#xff0c;即学习…

软件测试分类: 你需要知道的不同类型测试

文章目录 一. 按测试对象进行划分1. 界面测试2. 可靠性测试3. 容错性4. 文档测试5. 兼容性测试6. 易用性测试7. 安装卸载的测试8. 安全测试9. 性能测试10. 内存泄漏测试 二. 按是否查看代码划分1. 黑盒测试(Black-box Testing)2. 白盒测试(White-box Testing)冒泡排序测试用例进…