OpenCV(Python)基础—9小时入门版

OpenCV(Python)基础—9小时入门版

# =============================================
# Author : Mikigo
# Time   : 2021/12/1
# =============================================

一、一句话简介

OpenCV (Open Source Computer Vision Library) 是用 C++ 语言编写,提供 PythonJava 等语言 API的一个开源计算机视觉库。

二、安装

1、Debian 系使用 apt 安装 OpencCV

sudo apt install python-opencv

UOS 系统上,也可以使用:

sudo apt install python3-opencv

支持 AMDARMMIPS 架构安装。

2、安装 NumPy

NumPy 是 Python中的一个运算速度非常快的数学库,数组玩到起飞,如果你玩数据科学、机器学习,这是必学库。所有 OpenCV 数组结构都转换为 NumPy 数组,要想 OpenCV 学得好,必须熟悉它,学习 OpenCV 基础多少需要了解一点。

sudo apt -y install python3-numpy

好多同学安装 Python 库都习惯使用 pip 安装,实际上 OpenCV 也可以,但是目前只支持在 AMD,所以考虑到兼容性还是建议使用 apt 进行安装,并且官方文档也是建议使用 apt 安装。

三、入门基础

所有 OpenCV 类和函数都放在 cv 名称空间中,在 py 文件中导入:

import cv2 as cv

后续内容默认都使用了导入。

1、图像

1.1、读图像
img = cv.imread()
  • 参数1:文件路径。(str)
  • 参数2:读取图像的方式。
    • cv.IMREAD_COLOR 加载一个彩色图像,忽略 alpha 通道。(默认值)
    • cv.IMREAD_GRAYSCALE 加载图像为灰度模式。
    • cv.IMREAD_UNCHANGED 加载图像,包括 alpha 通道。
    • 还可以简单地分别传递整数1、0或 -1。
1.2、显示图像
cv.show()
  • 参数1:窗口名称。(str)
  • 参数2:图像。(obj)

在窗口中显示图像,窗口自动适合图像大小。

销毁窗口

cv.destroyAllWindows() # 销毁所有窗口
cv.destroyWindow("window_name") # 销毁某个窗口,参数传入窗口名称
1.3、写图像
cv.imwrite()
  • 参数1:文件名。
  • 参数2:图像。(obj)

2、视频

2.1、从摄像头捕获视频
cap = cv.VideoCapture(0)

它的参数可以是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字。一般我们连接一个摄像头,所以传0(或-1)。当然可以通过传递1来选择第二个相机,以此类推。

import cv2 as cv
cap = cv.VideoCapture(0)# 判断是否打开
if not cap.isOpened(): exit()
while True:  # 逐帧捕获ret, frame = cap.read()  # 判断是否读取到if not ret:  break# 转灰度gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 显示图像cv.imshow('frame', gray)# 监控键盘信号if cv.waitKey(1) == ord('q'):break
# 释放
cap.release()
cv.destroyAllWindows()

一切都看起来很和谐哈。

需要注意其他的两个判断:

  • 有时候摄像头可能没有初始化成功,所以用cap.isOpened() 来判断,并退出。
  • 可能没有接收到帧,停止循环。

获取视频的一些属性:

cap.get(id)

id 是一个从0到18的数字,每个数字表示视频的一个属性。每个属性代表什么→(docs.opencv.org/4.1.2/d4/d1…

cap.set() 属于进阶用法,这里按下不表。

2.2、从文件中播放视频

原理和从摄像头中捕获是一样的,区别在于:

cap = cv.VideoCapture('vtest.avi')

参数是文件名称。

2.3、保存视频
out = VideoWriter()
  • 参数1:文件名
  • 参数2:fourcc = cv.VideoWriter_fourcc(*‘XVID’)
    • FourCC 是一个4字节的代码,用于指定视频编解码器。
    • DIVX, XVID, MJPG, X264, WMV1, WMV2
    • 不同的操作系统有差异 www.fourcc.org/codecs.php
  • 参数3:帧率
  • 参数3:分辨率
import cv2 as cv
cap = cv.VideoCapture(0)
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640,  480))
while cap.isOpened():ret, frame = cap.read()if not ret:break# 旋转后写入frame = cv.flip(frame, 0)out.write(frame)cv.imshow('frame', frame)if cv.waitKey(1) == ord('q'):break
# 释放
cap.release()
out.release()
cv.destroyAllWindows()

结合前面摄像头捕获视频的代码,看起来很简单~

3、绘图

3.1、画线
cv.line()

举例:创建一个黑色图像,并从左上角到右下角在上面画一条蓝线

import numpy as np
import cv2 as cv
# 写一个黑色的图像
img = np.zeros((512,512,3), np.uint8)
# 画一根5像素款的蓝线
cv.line(img,(0,0),(511,511),(255,0,0),5)

(255,0,0) 代表蓝色,最后一个参数是线的宽度。

3.2、画圆
cv.circle(img,(447,63), 63, (0,0,255), -1)

参数:中心坐标和半径

3.3、画矩形
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)

参数:矩形的左上角和右下角

支持其他图形。。。

四、核心功能

1、图像的基本操作

1.1、访问和修改像素值
import numpy as np  # 官方建议固定写法
import cv2 as cv
img = cv.imread('messi5.jpg')
px = img[100,100]  
# (100, 100)的像素值[157 166 200](B、G和R值)
blue = img[100,100,0] 

修改

img[100,100] = [255,255,255]

直接赋值即可修改,但是直接访问非常缓慢,更好的像素访问和编辑方法:

img.item(10,10,2)  # 访问R值
img.itemset((10,10,2),100)  # 修改R值
1.2、访问图像属性

图像属性包括行数、列数和通道数、图像数据类型、像素数等。

img.shape
# (342,548,3)

返回一个行、列和通道数的元组。

img.size  # 访问像素总数
1.3、特定区域

机器学习中经常需要抠图,比如人脸识别时,一般会先选择人脸区域,搜索其中的眼睛,而不是搜索整个图像,以提供精确度。

ball = img[280:340, 330:390] # 抠一个区域
img[273:333, 100:160] = ball # 复制到另一个区域
1.4、图像信道的分裂与合并
b,g,r = cv.split(img)  # 分裂
img = cv.merge((b,g,r))  # 合并

或者

b = img[:,:,0]

比如将所有红色像素设置为零

img[:,:,2] = 0

2、图像的算术运算

2.1、图片添加
cv.add()

可以添加两个图像

x = np.uint8([250])
y = np.uint8([10])
cv.add(x + y)  # 250+10 = 260 => 255

OpenCV 的加法和 Numpy 的加法是有区别的。OpenCV 加法是一个饱和操作,而 Numpy 加法是一个除余操作。

x + y  # 250+10 = 260 % 256 = 4
2.2、图像混合
cv.addWeighted()

也是图像添加,但不同的权重给予图像,使它给人一种混合或透明的感觉。

  • 参数1、2:图像1及其权重。
  • 参数3、4:图像2及其权重。
  • 参数5:图像混合的α 值,通过改变 α 从0→1,你可以在一张图片到另一张图片之间进行一个很魔幻的转换。
img1 = cv.imread('ml.png')
img2 = cv.imread('opencv-logo.png')
# 第一幅图像的权重为0.7,第二幅图像的权重为0.3
dst = cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()
2.3、按位操作

按位 AND、 OR、 NOT 和 XOR 操作。

可以理解为图像的逻辑运算:

img1 = cv.imread('messi5.jpg')
img2 = cv.imread('opencv-logo-white.png')
# 把标志放在左上角,所以创建了一个roi
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# 创建一个标志图案,以及它的反面
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY) # 灰度处理
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
# 黑掉 ROI 中的 logo 区域
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 只取标志图像中的标志区域
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 将 logo 放入 ROI 中,并修改主图像
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()

五、图像处理

1、改变色彩空间

OpenCV 目前有150多种颜色空间转换方法。但其中两个最广泛使用的:

1.1、Gray

cv.COLOR_BGR2GRAY

顾名思义:BGR → Gray

这个图像识别中经常使用,可以提供识别速度和准确度。

1.2、HSV

cv.COLOR_BGR2HSV

顾名思义:BGR → HSV

HSV 图像可以用它来提取有色物体在 HSV 中,比在 BGR 颜色空间中更容易表示颜色。

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while True:# 取出视频的每一帧_, frame = cap.read()# 从 BGR 到 HSV 颜色空间的转换hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)# 定义 HSV 中蓝色的范围lower_blue = np.array([110,50,50])upper_blue = np.array([130,255,255])# 得到蓝色mask = cv.inRange(hsv, lower_blue, upper_blue)# 按位-and 蒙版和原始图像res = cv.bitwise_and(frame,frame, mask= mask)cv.imshow('frame',frame)cv.imshow('mask',mask)cv.imshow('res',res)k = cv.waitKey(5) & 0xFFif k == 27:break
cv.destroyAllWindows()

2、几何变换

2.1、缩放
res = cv.resize(InputArray, OutputArray, Size, fx, fy, interpolation)
参数解释
nputArray src输入图片
OutputArray dst输出图片
Size输出图片尺寸
fx, fy沿x轴,y轴的缩放系数
interpolation插入方式

interpolation 默认情况下,使用的插值方法是 cv.INTER_LINEAR,用于所有调整大小。

举例:

import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg')
res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC)
2.2、旋转
cv.getRotationMatrix2D()

旋转90度:

img = cv.imread('messi5.jpg',0)
rows,cols = img.shape
# cols-1 and rows-1 are the coordinate limits.
M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)
dst = cv.warpAffine(img,M,(cols,rows))

3、图像阈值化

3.1、自适应阈值分割

如果像素值小于阈值,则将其设置为0,否则将其设置为最大值。

ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
  • cv.THRESH_BINARY
  • cv.THRESH_BINARY_INV
  • cv.THRESH_TRUNC
  • cv.THRESH_TOZERO
  • cv.THRESH_TOZERO_INV

如果一个图像在不同的区域有不同的照明条件,全局使用一个阈值一般是不可用的,对同一幅图像的不同区域采用不同的阈值,对不同光照条件下的图像取得了较好的效果。

  • cv.ADAPTIVE_THRESH_MEAN_C 阈值是邻近区域的平均值减去常数 c
  • cv.ADAPTIVE_THRESH_GAUSSIAN_C 阈值是邻域值减去常数 c 的高斯加权和
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('sudoku.png',0)
img = cv.medianBlur(img,5)
ret,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,2)
th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,11,2)
titles = ['Original Image', 'Global Thresholding (v = 127)','Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in xrange(4):plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])
plt.show()

4、模板匹配

4.1、单目标匹配

模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。

cv.matchTemplate()
  • 参数1:大图
  • 参数2:小图
  • 参数3:匹配方法
    • cv.TM_CCOEFF
    • cv.TM_CCOEFF_NORMED
    • cv.TM_CCORR
    • cv.TM_CCORR_NORMED
    • cv.TM_SQDIFF
    • cv.TM_SQDIFF_NORMED

查找最大/最小值

 cv.minMaxLoc()
res = cv.matchTemplate(source, template, cv.TM_CCOEFF_NORMED)
cv.minMaxLoc(res)
4.2、多目标匹配

cv.minMaxLoc()不会给出所有位置。

通过阈值处理多个模板匹配。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv.imread('mario.png')
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('mario_coin.png',0)
w, h = template.shape[::-1]
res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)
loc = np.where( res >= 0.8)
for pt in zip(*loc[::-1]):cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
cv.imwrite('res.png',img_rgb)

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

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

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

相关文章

Innosetup 调用c# dll 和 c# dll的函数导出

目标需求,基于现在安装包脚本。需要在用户安装和卸载成功时。进行数据记录,所以需要调用c#dll 主要涉及到的知识点 需要理解脚本的文件使用机制脚本的文件dll加载,和dll的调用c# dll的制作,和工具的使用 下面具体介绍 脚本的文件dll加载&…

OSPF的DR与BDR-新版(16)

目录 整体拓扑 操作步骤 1.基本配置 1.1 配置R1的IP 1.2 配置R2的IP 1.3 配置R3的IP 1.4 配置R4的IP 1.5 检测R1与R4连通性 1.6 检测R1与R2连通性 1.7 检测R1与R3连通性 2.搭建基本的OSPF网络 2.1 配置R1 OSPF 2.2 配置R2 OSPF 2.3 配置R3 OSPF 2.4 配置R4 OSPF…

八皇后问题(C语言)

了解题意 在一个8x8的棋盘上放置8个皇后,使得任何两个皇后都不能处于同一行、同一列或同一斜线上。问有多少种方法可以放置这8个皇后? 解决这个问题的目标是找到所有符合要求的皇后摆放方式,通常使用回溯算法来求解。回溯算法会尝试所有可能…

数据结构之树 --- 二叉树 < 堆 >

目录 1. 树是什么&#xff1f; 1.1 树的表示 2. 二叉树 2.1 二叉树的概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 2.4.1 顺序存储 2.4.2 链式存储 3. 二叉树顺序结构的实现 <堆> 3.1 二叉树的顺序结构 ​编辑 3.2 堆的概念及结构 ​编辑…

Appium+python自动化(八)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 下(超详解)

简介 通过上一篇宏哥给各位小伙伴们的引荐&#xff0c;大家移动对这位美女有了深刻的认识&#xff0c;而且她那高超的技艺和婀娜的身姿久久地浮现在你的脑海里&#xff0c;是不是这样呢&#xff1f;&#xff1f;&#xff1f;不要害羞直接告诉宏哥&#xff1a;是&#xff0c;就对…

C单片机数据类型与格式化

C语言数据类型 关键字位数表示范围stdint关键字ST关键字举例unsigned char80 ~ 255uint8_tu8u8 data 128char8-128 ~ 127int8_ts8s8 temperature 25unsigned short160 ~ 65535uint16_tu16u16 counter 5000short16-32768 ~ 32767int16_ts16s16 position 32767unsigned int3…

基于YOLOv5+Deepsort 的PCB缺陷检测及计数系统

背景&#xff1a; PCB&#xff08;Printed Circuit Board&#xff0c;印刷电路板&#xff09;是电子产品中至关重要的组成部分&#xff0c;它承载着电子元器件并提供电气连接。在PCB制造过程中&#xff0c;由于工艺、材料或设备等因素的影响&#xff0c;可能会引入各种缺陷&am…

电表通讯协议DLT645-2007编程

1、协议 电表有个电力行业推荐标准《DLT645-2007多功能电能表通信协议》&#xff0c;电表都支持&#xff0c;通过该协议读取数据&#xff0c;不同的电表不需要考虑编码格式、数据地址、高低位转换等复杂情况&#xff0c;统一采集。 不方便的地方在于这个协议定义得有点小复杂…

Strateg策略模式(组件协作)

策略模式&#xff08;组件协作&#xff09; 链接&#xff1a;策略模式实例代码 注解 目的 正常情况下&#xff0c;一个类/对象中会包含其所有可能会使用的内外方法&#xff0c;但是一般情况下&#xff0c;这些常使用的类都是由不同的父类继承、组合得来的&#xff0c;来实现…

跨境电商迎来综合竞争力比拼时代 五大趋势解读跨境2024

过去几年&#xff0c;跨境电商成为外贸出口增长的一大亮点&#xff0c;随着年底国务院办公厅《关于加快内外贸一体化发展的若干措施》的发布&#xff0c;跨境电商在促进经济发展、助力内外贸一体化发展方面的价值更加凸显。 这是跨境电商变化最快的时代&#xff0c;也是跨境电…

Getway介绍和使用

Getway 入门简介 网关搭建步骤&#xff1a; 创建项目&#xff0c;引入nacos服务发现和gateway依赖 配置application.yml&#xff0c;包括服务基本信息、nacos地址、路由 路由配置包括&#xff1a; 路由id&#xff1a;路由的唯一标示 路由目标&#xff08;uri&#xff09;…

常用环境部署(十二)——Redis搭建主从模式(一主一从)

一、主从服务器Redis安装 1、注意事项 主从服务器Redis尽量安装同一版本&#xff0c;避免兼容性造成的一些错误产生 2、Centos安装Redis 链接&#xff1a;​​​​​​常用环境部署(十)——MySQL主从同步数据搭建(一主一从)-CSDN博客 二、 主Redis配置 1、修改主Redis配置…

听说上海移动年终奖16个月!我承认我酸了!

* 你好&#xff0c;我是前端队长&#xff0c;在职场&#xff0c;玩副业&#xff0c;文末有福利! 今天&#xff0c;队长看到一篇帖子&#xff0c;有网友发帖说上海移动的年终奖发了16个月&#xff0c;我承认我酸了。 看到这里&#xff0c;我承认我也酸了。16个月是什么概念&…

【C/C++笔试练习】sort排序、STL容器、vector的特性、一级容器、迭代器失效、异常捕获、动态转换、统计每个月兔子的总数、字符串通配符

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;sort是不稳定排序&#xff08;2&#xff09;存放即有序的STL容器&#xff08;3&#xff09;连续储存的STL容器&#xff08;4&#xff09;vector的特性&#xff08;5&#xff09;一级容器&#xff08;6&#xff09;unorde…

PLC-IoT 网关开发札记(1):存档和分发 Android App

开篇记 PLC-IoT 网关是作者开发的产品&#xff0c;根据客户需求&#xff0c;立项开发手机 App&#xff0c;为用户提供一种方便、直观、友好的设备操控方式。网关运行的是嵌入式 Linux 操作系统&#xff0c;计划通过某一种通信协议&#xff08;例如 HTTP&#xff0c;MQTT或者 T…

大数定律中心极限定理

1.切比雪夫不等式 切比雪夫不等式可以对随机变量偏离期望值的概率做出估计&#xff0c;这是大数定律的推理基础。以下介绍一个对切比雪夫不等式的直观证明。 1.1 示性函数 对于随机事件A&#xff0c;我们引入一个示性函数 I A { 1 , A发生 0 , A不发生 I_A\begin{cases} 1&…

Chrome浏览器进程工作原理和机制

Chrome浏览器进程工作原理和机制 Chrome架构&#xff1a;一个页面四个进程进程和线程单进程浏览器多进程浏览器多进程浏览器解决的问题Chrome的进程模式 TCP协议&#xff1a;如何保证页面文件被完整送达浏览器IP&#xff1a;把数据包送达目的主机UDP&#xff1a;把数据包送达应…

vivado CDC约束-约束总线偏移

CDC限制 关于CDC约束 时钟域交叉&#xff08;CDC&#xff09;约束适用于具有不同启动和捕获时钟。根据发布和捕获时钟关系以及在CDC路径上设置的定时异常。例如同步时钟之间但被错误路径约束覆盖的CDC路径不定时&#xff0c;并且因此被视为异步CDN。异步CDC路径可以是安全的&…

vue 导出 HTML 结构为 Word 文档(.docx)-支持表格、css样式、图片

在 Web 开发中&#xff0c;有时我们希望用户能够将网页上的 HTML 内容保存为 Word 文档&#xff0c;以便更方便地分享和打印。本文将介绍如何使用 html-docx-js 和 file-saver 这两个 JavaScript 库&#xff0c;实现将 HTML 结构导出为 Word 文档的功能。 工具简介 1. html-d…

lv13 内核模块参数和依赖

1 模块传参 1.1 模块参数设置 将指定的全局变量设置成模块参数 module_param(name,type,perm);//将指定的全局变量设置成模块参数 /* name:全局变量名 type&#xff1a;使用符号 实际类型 传参方式bool bool insmod xxx.ko 变量名0 …