OpenCV入门-基于Python(下)

简介: OpenCV入门-基于Python

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()

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()

将图片的BGR通道拆开成B,G,R三个通道。

cv2.split(mat)

mat:需要拆分的图像

返回值有三个,用三个变量接收

merge()

将拆分的通道合成一个图像

cv2.merge((ch1,ch2,ch3))

参数:ch1,ch2,ch3分别代表各个通道,并且用元组表示。

返回值是拼好的图像

代码展示

# 创建一个全黑的图像
img = np.zeros((480, 640, 3),np.uint8)
# BGR通道分割
r, g, b = cv2.split(img)
# 仅仅修改两个通道的颜色
r[100:200, 100:200] = 255
b[100:200, 100:200] = 255
# 再次合并成新图形
img2 = cv2.merge((b, g, r))
cv2.imshow('img', img)
cv2.imshow('img2', img2)

8. 图像的基本操作

cvtColor()

用于将图像从一个颜色空间转换为另一个颜色空间。

dst = cv2.cvtColor(src,flag)

src:需要转换的图像

flag:见下表

返回值dst,转换颜色空间后的图像

(flag)标志 简记 作用
cv2.COLOR_BGR2BGRA 0 为RGB图像添加alpha通道
cv2.COLOR_BGR2RGB 4 由BGR变成RGB顺序
cv2.COLOR_BGR2GRAY 10 将彩色图像变成灰度图像
cv2.COLOR_BGR2YUV 82 从RGB颜色空间转成YUV颜色空间
cv2.COLOR_BGR2HSV 40 从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()


目录
相关文章
|
1天前
|
开发者 Python
Python入门:8.Python中的函数
### 引言 在编写程序时,函数是一种强大的工具。它们可以将代码逻辑模块化,减少重复代码的编写,并提高程序的可读性和可维护性。无论是初学者还是资深开发者,深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始,逐步讲解 Python 中的函数及其高级特性。
Python入门:8.Python中的函数
|
1天前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
1天前
|
程序员 UED Python
Python入门:3.Python的输入和输出格式化
在 Python 编程中,输入与输出是程序与用户交互的核心部分。而输出格式化更是对程序表达能力的极大增强,可以让结果以清晰、美观且易读的方式呈现给用户。本文将深入探讨 Python 的输入与输出操作,特别是如何使用格式化方法来提升代码质量和可读性。
Python入门:3.Python的输入和输出格式化
|
1天前
|
缓存 算法 数据处理
Python入门:9.递归函数和高阶函数
在 Python 编程中,函数是核心组成部分之一。递归函数和高阶函数是 Python 中两个非常重要的特性。递归函数帮助我们以更直观的方式处理重复性问题,而高阶函数通过函数作为参数或返回值,为代码增添了极大的灵活性和优雅性。无论是实现复杂的算法还是处理数据流,这些工具都在开发者的工具箱中扮演着重要角色。本文将从概念入手,逐步带你掌握递归函数、匿名函数(lambda)以及高阶函数的核心要领和应用技巧。
Python入门:9.递归函数和高阶函数
|
1天前
|
存储 SQL 索引
Python入门:7.Pythond的内置容器
Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器:字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。
Python入门:7.Pythond的内置容器
|
1天前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
1天前
|
知识图谱 Python
Python入门:4.Python中的运算符
Python是一间强大而且便捷的编程语言,支持多种类型的运算符。在Python中,运算符被分为算术运算符、赋值运算符、复合赋值运算符、比较运算符和逻辑运算符等。本文将从基础到进阶进行分析,并通过一个综合案例展示其实际应用。
|
4月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
943 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
5月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
76 4
|
5月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制

热门文章

最新文章

推荐镜像

更多