OpenCV入门-基于Python

news/2025/1/12 18:12:12/

图像入门

  • 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()
    • 部分代码示例
  • 7.Numpy基础(为了方便调用,用np表示)
    • Numpy库创建矩阵
      • array()
      • zeros()/ones
      • full()
      • identity()/eye()
      • 代码演示
    • Numpy检索与赋值
      • 代码演示
    • Mat
      • 代码演示
    • 深浅拷贝
      • 代码演示:
    • 通道分离与合并
      • split()
      • merge()
  • 8. 图像的基本操作
    • 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 cv2fourcc = 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 npdef 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 npdef 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("退出成功")breakimg[:] = [b, g, r]# 释放资源
cv2.destroyAllWindows()

7.Numpy基础(为了方便调用,用np表示)

在OpenCV中用到的矩阵都要转换成Numpy数组,Numpy是一个高度优化的数值库,速度很快。

Numpy库创建矩阵

array()

直接创建数组
np.array(mat)
mat:一维数组[1,2,3],二维数组:[[1,2,3],[4,5,6],[7,8,9]]…
返回值是一个数组

zeros()/ones

创建全0/1的数组
np.zeros((row,col,通道数/层数),数据类型)
参数: 第一个三元组,是矩阵的行数、列数、通道数;第二个是数据类型
返回值是一个数组

full()

创建全值数组(矩阵全部为一个数值)
np.full((row,col,通道数/层数),val,数据类型)
参数: 第一个三元组,是矩阵的行数、列数、通道数;第二个是矩阵的数值;第三个是数据类型
返回值是一个数组

identity()/eye()

创建单元数组
np.identy(n)/np.eye(n)
参数:n:创建n*n的单位矩阵
返回值是一个数组
np.eye(row,col ,k)
参数:row行col列数组,从第1行第k个数字,开始写1,可以不是正方形
返回值是一个数组

代码演示

import cv2
import numpy as np# 创建一维,二维数组
a = np.array([1, 2, 3])
b = np.array([[1,2, 3],[4,5,6],[7,8,9]])
print(a)
print(b)# 创建全0/1数组
# 这样写会显示8*8的矩阵,如果换成(8,8,3)
# 由于print解释不同,会打印成8个8*3的矩阵
c = np.zeros((8, 8),np.uint8)
d = np.ones((8, 8),np.uint8)
print(c)
print(d)# 创建全值矩阵,每个值都为10
e = np.full((5, 5), 10, np.uint8)
print(e)# 创建单位矩阵
f = np.identity(5)
g = np.eye(2)
print(f)
print(g)
# 不是正方形的单位矩阵
# 从第一行k开始为1
h = np.eye(2, 3, 1)
print(h)

Numpy检索与赋值

key:用python访问和修改数组

[y,x] 坐标是反过来的
[y,x,channel] 访问指定通道的值
==[y1:y2,x1:x2]==访问该区间的值
[:,:]与[:]相等访问范围内的所有坐标
[:,10] 访问横坐标是10的所有坐标

代码演示

import cv2
import numpy as np# 创建一个全0的数组
a = np.zeros((480, 640, 3), np.uint8)
# 直接展示图像
cv2.imshow('a', a)
# 将一个范围修改为绿色
# a[100:200, 100:200] = [0, 255, 0] 和下面的方法相等,都是修改绿色通道
# a[100:200, 100:200, 1] = [255]# 修改横坐标为20的所有坐标
# a[:,20] = [0, 0, 255]# 访问全体
a[:] = [255,255,255]
cv2.imshow('a2', a)
cv2.waitKey(0)

Mat

mat在python中代表的是数组对象,这个对象主要包含mat属性以及数据。在python中,每个数组都有这些属性。

img.shape :显示高度,长度和通道数
img.size:图像占用多大空间
img.dtype:每个元素的位深

在这里插入图片描述

代码演示

# 创建一个全0的数组
a = np.zeros((480, 640, 3), np.uint8)print(a.shape)
print(a.size)
print(a.dtype)

深浅拷贝

日常直接创建变量的方法是浅拷贝,虽然变量名不同,但是共享同一块数据,改变其中一个变量,另一个变量的数据也跟着改变,这是浅拷贝。如果完全复制一份同样的数据存到另一个变量中,两个变量的改变互不影响,这个就是深拷贝。

img3 = img.copy()

代码演示:

# 深浅拷贝# 创建一个全0的数组
img1 = np.zeros((480, 640, 3), np.uint8)
# img3为深拷贝,img2为浅拷贝
img3 = img1.copy()
img2 = img1
img2[100:200,100:200] = [255,0,255]
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

通道分离与合并

将BGR三个通道拆分与合并

split()

merge()

8. 图像的基本操作

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 cv2def 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.ppmy.cn/news/80526.html

相关文章

安卓动画壁纸实战:制作一个星空动态壁纸(带随机流星动画)

前言 在我之前的文章 羡慕大劳星空顶?不如跟我一起使用 Jetpack compose 绘制一个星空背景(带流星动画) 中,我们使用 Compose 实现了星空背景效果。 并且调用非常方便,只需要一行代码就可以给任意 Compose 组件添加上…

「SQL面试题库」 No_77 每月交易II

🍅 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试&#xff0…

BigDecimal类型的数据范围判断与加减乘除操作

如何判断BigDecimal类型的数据范围再正负5之间 要判断一个BigDecimal类型的数据是否在正负5之间,你可以使用BigDecimal的compareTo()方法进行比较。 以下是使用Java的BigDecimal类来判断一个数值是否在正负5之间的示例: import java.math.BigDecimal;pu…

C语言—通讯录

通讯录 通讯录的创建通讯录的初始化通讯录添加联系人信息通讯录删除特定联系人信息通讯录查找特定联系人信息通讯录修改特定联系人信息通讯录排序联系人信息通讯录打印联系人信息通讯录整体代码 通讯录的创建 通讯录中是存放人的信息的,人的信息包括:姓…

【这个问题纠结了我好多年】3dMax到底使用Intel还是AMD的CPU更好?

随着英特尔和 AMD 的新 CPU上市,是时候进行新一轮的硬件测试了。通过以极具竞争力的价格提供大量内核,AMD 已成为 CPU 领域的有力竞争者。作为回应,英特尔已开始增加其 CPU 中的内核数量。虽然它们提供的内核数量仍然不如 AMD,但它…

深度学习 - 51.推荐场景下的 Attention And Multi-Head Attention 简单实现 By Keras

目录 一.引言 二.计算流程 1.Attention 结构 2.Multi-Head Attention 结构 三.计算实现 1.Item、序列样本生成 2.OwnAttention Layer 实现 2.1 init 初始化 2.2 build 参数构建 2.3 call 逻辑调用 3.OwnAttention Layer 测试 四.总结 一.引言 Attention And Multi…

配电室智能监控系统设计及实现分析

摘 要:配电室作为电网正常运行中的基础性设施,在信息化建设中处于信息交换管理的核心位置,这就要求配电室内所有设备须时时刻刻正常运转,一旦某台设备出现故障,对数据传输、存储及系统运行构成威胁,就会影…

RK3568平台开发系列讲解(驱动基础篇)RK 看门狗的使用

🚀返回专栏总目录 文章目录 一、简介二、DTS配置三、使用沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将对RK 看门狗的使用进行学习。 文章目录 一、简介二、DTS配置三、使用一、简介 看门狗(watchdog)是一个定时器,启动之后会开始计时。系统或者软件需要…