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


目录
相关文章
|
8天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
6天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
6天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
6天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
5天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
18 3
|
7天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
8天前
|
人工智能 数据挖掘 程序员
Python编程入门:从零到英雄
【10月更文挑战第37天】本文将引导你走进Python编程的世界,无论你是初学者还是有一定基础的开发者,都能从中受益。我们将从最基础的语法开始讲解,逐步深入到更复杂的主题,如数据结构、面向对象编程和网络编程等。通过本文的学习,你将能够编写出自己的Python程序,实现各种功能。让我们一起踏上Python编程之旅吧!
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
335 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
49 4
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制