Python学习笔记—100页Opencv详细讲解教程

目录

1 创建和显示窗口... - 4 -

2 加载显示图片... - 6 -

3 保存图片... - 7 -

4 视频采集... - 8 -

5视频录制... - 11 -

6 控制鼠标... - 12 -

7 TrackBar 控件... - 14 -

8.RGB和BGR颜色空间... - 16 -

9.HSV和HSL和YUV.. - 17 -

10 颜色空间的转化... - 18 -

11 mat的深浅拷贝... - 19 -

12 颜色通道的分离与合并... - 20 -

13 画直线... - 22 -

14 绘制矩形和圆... - 23 -

15 绘制椭圆... - 24 -

16 绘制多边形和填充多边形... - 25 -

17 绘制文本及中文文本... - 26 -

18 作业:根据需要画图... - 28 -

19 图像运算之加减乘除... - 30 -

20 图片的融合... - 32 -

21 Opencv的位运算... - 33 -

22 resize() 用法... - 35 -

23 图片上加Logo(完美贴合) - 36 -

24 图像的翻转与旋转... - 39 -

25 仿射变换之平移... - 40 -

26 仿射变换之获取变换矩阵... - 42 -

27  仿射变换之透视变换... - 44 -

28  卷积操作... - 45 -

29 均值滤波和方盒滤波... - 48 -

30 高斯滤波... - 49 -

31 中值滤波... - 50 -

32 双边滤波... - 51 -

33 索贝尔(sobel) 算子... - 52 -

34 scharr算子... - 53 -

35 拉普拉斯算子... - 54 -

36 形态学... - 55 -

37 Canny边缘检测... - 56 -

38 全局二值化... - 57 -

39 自适应阈值二值化... - 58 -

40 腐蚀操作... - 59 -

41 获取形态学卷积核... - 60 -

42 膨胀操作... - 61 -

43 开运算... - 62 -

44 闭运算... - 63 -

45 形态学梯度... - 64 -

46 顶帽操作... - 65 -

47 黑帽操作... - 66 -

48 查找轮廓... - 67 -

49 绘制轮廓... - 68 -

50 计算轮廓面积和周长... - 69 -

51 多边形逼近... - 71 -

52 凸包... - 72 -

53 最小外接矩形和最大外接矩形... - 74 -

54 高斯金字塔... - 76 -

55 拉普拉斯金字塔... - 78 -

56 图形直方图介绍... - 78 -

57 使用Opencv统计直方图... - 79 -

58绘制直方图... - 79 -

59用掩膜的直方图... - 80 -

60图均衡化... - 82 -

61 车辆统计项目(一)... - 83 -

71 特征检测基本概念... - 89 -

72 harris 角点检测数学原理1. - 90 -

73 Harris角点检测数学原理2. - 90 -

74 harris 角点检测应用... - 90 -

75 sift算法原理... - 91 -

76 sift算法使用... - 91 -

77 shi-tomasi 角点检测... - 91 -

1 创建和显示窗口

  1. namedWindow()       创建命名窗口
  2. imshow()                   显示窗口
  3. destroyAllwindws()    摧毁窗口
  4. resizeWindow()          改变窗口大小
  5. waitKey()                    等待用户输入

import cv2

# 创建窗口之前不要调整窗口大小

cv2.namedWindow('window', cv2.WINDOW_NORMAL)  # 创建窗口

cv2.resizeWindow('window', 600, 800)  # 调整窗口大小

# 显示图像

image = cv2.imread('path_to_image')

cv2.imshow('window', image)

# 等待按键后关闭窗口

cv2.waitKey(0)

cv2.destroyAllWindows()

确保在调用 cv2.resizeWindow 之前窗口已经创建,并且在窗口存在的情况下调整其大小。

  1. ord()计算ASCII数值

  1. import cv2


    #创建窗口
    # WINDOW_NORMAL 可以让窗口大小变得可调节,默认WINDOW_AUTOSIZE  自动大小
    cv2.namedWindow('new',cv2.WINDOW_NORMAL)
    cv2.resizeWindow(
    'new',600,800)

    # 展示名字为window的窗口
    cv2.imshow('window',0)   #没有内容只好写0
    cv2.resizeWindow('window',600,800)

    # 等待按键输入;0表示接收任意按键,如果给其他整数,表示等待按键的时间,单位毫秒;可以利用waitKey()实现关闭窗口
    key = cv2.waitKey(0)   #key 为键盘输入的ASCII
    if key & 0xFF == ord('q'):
       
    print('准备销毁窗口')
        cv2.destroyAllWindows()
    # 销毁所有窗口

2 加载显示图片

  1. imread(path,flag):使用imread可以读取图片,默认读取的是彩色图片。

    Matplotlib显示的图片和实际不一样,因为opencv读取的颜色通道是按照BGR排列的,一般照片是RGB,为了显示正常要用opencv的显示方法:

如果常用显示图片可以封装成函数,以后可以使用(自己所有的功能都可以封装起来,以后导入就可以直接用,方便积累)


import cv2

# 显示图片
def cv_show(name,img):
    cv2.imshow(
'name',img)
    cv2.waitKey(
0)
    cv2.destroyAllWindows()

import cv2
import monkey
import matplotlib.pyplot as plt
import numpy as np

# 读取图片
img = cv2.imread('2.jpg')


# 显示图片
monkey.cv_show('侯文广',img)
monkey.music_play()

3 保存图片

imwrite(path,img):使用imwrite保存图片

“./123.png” # 当前目录下的图片。

import cv2

cv2.namedWindow(
'img',cv2.WINDOW_NORMAL) #创建一个窗口
cv2.resizeWindow('img',320,240#设置窗口尺寸

img = cv2.imread('./2.jpg'# 载入当前目录下的图片

#利用while 循环优化退出逻辑
while True:
    cv2.imshow(
'img',img)
    key = cv2.waitKey(
0)    #接收键盘的输入字母的ASCII
   
if(key&0xff==ord('q')):
       
break
    elif
(key&0xff==ord('s')):
        cv2.imwrite(
r'D:/5.png',img)
       
print('保存成功')
       
break
    else
:
       
print(key)
       
break

cv2.destroyAllWindows()

4 视频采集

视频是由图片组成的,视频的每一帧就是一幅图片,一般是30帧。

cv2.VideoCapture可以捕获摄像头,用数字来表示不同的设备,比如0,1

如果是视频文件直接指定路径即可。

读取视频

import cv2
# 创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow(
'video',640,380)

# 打开视频文件
vc = cv2.VideoCapture('./nine.mp4')

# 循环读取摄像头每一帧
while True:
   
# 读每一帧数据,返回标记和这一帧数据frameTrue表示读到了数据,False表示没读到数据
   
ret,frame = vc.read()  # ret表示标记,frame表示图片

   
# 可以根据ret做个判断
   
if not ret:
       
# 没有读到数据
       
break
   
# 显示窗口
   
cv2.imshow('video',frame)

   
# 退出条件
   
key = cv2.waitKey(1)
   
if key == ord('q'):
       
break

# 别忘了释放资源
vc.release()
cv2.destroyAllWindows()

读取摄像头

import cv2# 创建窗口cv2.namedWindow('video',cv2.WINDOW_NORMAL)cv2.resizeWindow('video',640,380)# 打开摄像头vc1 = cv2.VideoCapture(0)# 循环读取摄像头每一帧while True:    # 读每一帧数据,返回标记和这一帧数据frameTrue表示读到了数据,False表示没读到数据    ret,frame = vc1.read()  # ret表示标记,frame表示图片    # 可以根据ret做个判断    if not ret:        # 没有读到数据        break    # 显示窗口    cv2.imshow('video',frame)    # 退出条件    key = cv2.waitKey(1000//30) #每帧图片之间的间隔时间ms30帧,每帧之间隔多久)


    if key ==ord('q'):
       
break

# 别忘了释放资源
vc1.release()
cv2.destroyAllWindows()

5视频录制

  1. VideoWriter:参数一为输出文件,参数二为多媒体文件格式(VideoWriter.fourcc),参数三为帧率,参数四为分辨率。
  2. write 编码并写入缓存
  3. release 缓存内容写入磁盘,并释放资源
  4. import cv2

    cap = cv2.VideoCapture(
    0# 打开摄像头

    # *mp4v就是解包操作,等同于'm','p','4','v'
    fourcc = cv2.VideoWriter.fourcc(*'mp4v')

    # (640,480)表示摄像头拍视频,这个大小搞错了不行
    # 主要是分辨率

    vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))

    while cap.isOpened():
        ret, frame = cap.read()
       
    if not ret:
           
    print('can not receive framne ,Exiting ....')
           
    break

       
    vw.write(frame)
        cv2.imshow(
    'frame', frame)

       
    if cv2.waitKey(1) == ord('q'):
           
    break

6 控制鼠标

Opencv允许对窗口上的鼠标进行操作

  1. setMouseCallback(winname,callback,userdata),winname是窗口的名字,callback是回调函数,userdata是给回调函数的参数,
  2. callback(event,x,y,flags,userdata)回调函数包含这5个参数,event是事件(鼠标移动,左键,右键),x,y是点鼠标的坐标点,flags主要用于组合键,userdata是上面setMouseCallbackuserdata

鼠标事件:

  1. EVENT_MOUSEMOVE  0 鼠标移动
  2. EVENT_LBUTTONDOWN 1 按下鼠标左键
  3. EVENT_RBUTTONDOWN 2 按下鼠标右键
  4. EVENT_MBUTTONDOWN 3 按下鼠标中键
  5. EVENT_LBUTTONUP 4 左键释放
  6. EVENT_RBUTTONUP 5 右键释放
  7. EVENT_MBUTTONUP 6中键释放
  8. EVENT_LBUTTONDBLCLK 7 左键双击
  9. EVENT_RBUTTONDBLCLK 8 右键双击
  10. EVENT_MBUTTONDBLCLK 9 中键双击
  11. EVENT_MOUSEWHEEL 10鼠标滚轮上下滚动
  12. EVENT_MOUSEHWHEEL 11鼠标左右滚动

Flags:

  1. EVENT_FLAG_LBUTTON  1  按下左键
  2. EVENT_FLAG_RBUTTON   2 按下右键
  3. EVENT_FLAG_MBUTTON   4 按下中键
  4. EVENT_FLAG_CRTLKEY   8 按下CTRL键
  5. EVENT_FLAG_SHIFTKEY   16 按下SHIFTKEY键
  6. EVENT_FLAG_ALTKEY   32 按下ALT键
  7. import cv2
    import numpy as np

    # 函数名可以随便取,但是必须5个参数
    def mouse_callback(event,x,y,flags,userdata):
       
    # 内容根据具体作用进行更换(鼠标在窗口操作会触发函数)
       
    print(event,x,y,flags,userdata)
       
    # 根据event或者flags的值来定义函数
       
    # 按下鼠标右键退出
       
    if event == 2:
            cv2.destroyAllWindows()


    # 创建窗口
    cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
    # 窗口是宽度(列)高度(行)
    cv2.resizeWindow('mouse',640,360)

    # 设置鼠标回调函数
    # userdata'123'
    cv2.setMouseCallback('mouse',mouse_callback,'123')

    # 生成全黑图片
    # 先行(高)后列(宽)
    img = np.zeros((360,640,3),np.uint8)
    while True:
        cv2.imshow(
    'mouse',img)
        key = cv2.waitKey(
    1000//30)
       
    if key & 0xff == ord('q'):
           
    break

    cv2.destroyAllWindows()

7 TrackBar 控件

可以拖动的控件。

表示拖动了多少值。最多三原色控制

  1. createTrackbar(trackbarname,winname,value,count,onChange)

 创建TrackBar控件,valuetrackbar的默认值,countbar的最大值,trackbar的名字,窗口的名字。回调函数(trackbar动了会触发的结果)

  1. getTrackbarPos(trackbarname,winname)获取TrackBar当前值。

import cv2
import numpy as np

# 创建窗口
cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)
cv2.resizeWindow(
'trackbar',640,360)

# 定义回调函数
# 触发
def callback(value):
   
if value >= 50:
        
print(value)

# 创建trackbar
cv2.createTrackbar('R','trackbar',0,255,callback)
cv2.createTrackbar(
'G','trackbar',0,255,callback)
cv2.createTrackbar(
'B','trackbar',0,255,callback)

# 创建一个背景图片
img = np.zeros((360,640,3),np.uint8)

while True:
   
# 获取当前trackBar的值
   
r = cv2.getTrackbarPos('R','trackbar')
    g = cv2.getTrackbarPos(
'G', 'trackbar')
    b = cv2.getTrackbarPos(
'B', 'trackbar')

   
# 改变背景图颜色(bgr顺序)
   
img[:] = [b,g,r]
    cv2.imshow(
'trackbar',img)

    key = cv2.waitKey(
1000//30)
   
if key ==ord('q'):
       
break

cv2.destroyAllWindows()

8.RGB和BGR颜色空间

Opencv默认使用BGR排列顺序

9.HSV和HSL和YUV

Opencv采用最多HSV色彩空间

Hue:色相取值0—360°,从红色开始逆时针方向计算,红色为0°,绿色120°,蓝色240°。

Saturation:饱和度取值0—100%,饱和度高颜色越饱和,光谱色越多。越低越浅色。

Value(brightness):明度,光亮程度,0%黑,100%白

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。HSV色系对用户来说是一种直观的颜色模型,对于颜色,人们直观的会问”什么颜色?深浅如何?明暗如何?“,而HSV色系则直观的表示了这些信息。

每一种颜色都是由色相(Hue,简H),饱和度(Saturation,简S)和色明度(Value,简V)所表示的。这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。

色调H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,取值范围为0°~360°。若从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;

饱和度S:取值范围为0.0~1.0;

亮度V:取值范围为0.0(黑色)~1.0(白色)。

10 颜色空间的转化

  1. cvtColor(img,colorspace):颜色转化关键API
  2.  import cv2

    def callback(value):
       
    # 鼠标不同操作value不同值
       
    print(value)

    cv2.namedWindow(
    'color',cv2.WINDOW_NORMAL)
    cv2.resizeWindow(
    'color',640,480)

    img = cv2.imread(
    '2.jpg')

    # 常见颜色空间转换
    colorspaces = [cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2BGRA,cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2HSV,cv2.COLOR_BGR2YUV]

    # trackbar
    cv2.createTrackbar('curcolor','color',0,4,callback)

    while True:
       
    # 获得trackbar上的值
       
    index = cv2.getTrackbarPos('curcolor','color')

       
    # 颜色空间转化API
       
    cvt_img = cv2.cvtColor(img,colorspaces[index])

        cv2.imshow(
    'color',cvt_img)
        key = cv2.waitKey(
    1000//30)
       
    if key & 0XFF == ord('q'):
           
    break

    cv2.destroyAllWindows()

11 mat的深浅拷贝

Mat是Opencv在C++语言中用来表示图像数据的一种数据结构,在python中转化为numpy的ndarray。

  1. MAT 数据结构 由header和data组成。Header中记录了图片的维数,大小,数据类型等数据。

Ndarray的四种常见属性:data(数据存放的地址),size(元素总个数),dtype(数据类型),shape(形状)

  1. Mat 共享数据

Header 不同,data相同。

Mat的深浅拷贝就是对ndarry的深浅拷贝。

import cv2
import numpy as np

img = cv2.imread(
'2.jpg')

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

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

相关文章

数据结构——栈的实现(java实现)与相应的oj题

文章目录 一 栈栈的概念:栈的实现:栈的数组实现默认构造方法压栈获取栈元素的个数出栈获取栈顶元素判断当前栈是否为空 java提供的Stack类Stack实现的接口: LinkedList也可以当Stack使用虚拟机栈,栈帧,栈的三个概念 二 栈的一些算…

JetBrains IDE 使用git进行多人合作开发教程

以下DEMO可以用于多人共同开发维护一个项目时,使用Git远程仓库的实践方案 分支管理 dev:开发分支test:测试分支prod:生成分支 个人开发也最起码有一个masterdev,作为主分支和当前开发分支。master永远是稳定版本&am…

花几千上万学习Java,真没必要!(十九)

1、StringBuilder: 测试代码1: package stringbuilder.com; import java.util.ArrayList; import java.util.List; public class StringBuilderExample { public static void main(String[] args) { // 初始化StringBuilder StringBuilder sb n…

腾讯会议产品策划的成长之路:从万字文档到功能落地的实战经验

腾讯会议产品策划的成长之路:从万字文档到功能落地的实战经验 在腾讯会议的产品团队中,有这样一位产品策划,他以其出色的逻辑思维、全局观念以及扎实的执行力,在团队中发挥着举足轻重的作用。他就是林陪同,一个自称“会…

JAVA进阶学习12

文章目录 一、File类1.1 File对象的构造1.2 File对象的常见方法判断功能的方法获取功能的方法绝对路径和相对路径创建删除功能的方法 1.3 File的常用遍历方法1.4 File获取并遍历的其他方法1.5 用法举例二、IO流2.1 IO的分类2.2 字节流的方法概述2.2.1 FileOutputStream2.2.2 Fi…

UE4-字体导入

一.字体导入 方法一: 然后通过导入将自己想要的字体导入到项目中,也可以直接将我们放在桌面的字体直接拖入到我们的内容浏览器中。 但是要注意想要发售游戏的话不可以这样导入微软的字体,因为Windows自带基本都有版权,所以最…

明星应援系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,线上应援管理,线下应援管理,应援物品管理,购买订单管理,集资应援管理,集资订单管理,市集订单管理&#xff0…

【CSS in Depth 2 精译_020】3.3 元素的高度

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…

在 CI/CD 中怎么使用 Docker 部署前端项目?

本项目代码已开源,具体见: 前端工程:vue3-ts-blog-frontend 后端工程:express-blog-backend 数据库初始化脚本:关注公众号程序员白彬,回复关键字“博客数据库脚本”,即可获取。 前言 在上一篇文…

快速上手AI指令:打造个性化智能交互体验的全面指南

快速上手AI指令:打造个性化智能交互体验的全面指南 一、初识文心一言1.1 文心一言简介1.2 文心一言的特点 二、准备工作2.1 获取访问权限2.2 熟悉界面布局2.3 了解基础指令 三、基础指令操作3.1 问答互动3.2 文本创作3.3 任务规划 四、进阶指令操作4.1 复杂查询4.2 …

Python酷库之旅-第三方库Pandas(035)

目录 一、用法精讲 106、pandas.Series.iloc方法 106-1、语法 106-2、参数 106-3、功能 106-4、返回值 106-5、说明 106-6、用法 106-6-1、数据准备 106-6-2、代码示例 106-6-3、结果输出 107、pandas.Series.__iter__魔法方法 107-1、语法 107-2、参数 107-3、…

Java程序的故障排查

文章目录 Linux命令关机/重启/注销系统信息和性能查看磁盘和分区⽤户和⽤户组⽹络和进程管理常⻅系统服务命令⽂件和⽬录操作⽂件查看和处理打包和解压RPM包管理命令YUM包管理命令DPKG包管理命令APT软件⼯具 JDK命令jpsjstatjinfojmapjhatjstackjcmdjconsole 分析工具VisualVME…

自动驾驶-预测概览

通过生成一条路径来预测一个物体的行为,在每一个时间段内,为每一辆汽车重新计算预测他们新生成的路径,这些预测路径为规划阶段做出决策提供了必要信息 预测路径有实时性的要求,预测模块能够学习新的行为。我们可以使用多源的数据…

超简单安装指定版本的clickhouse

超简单安装指定版本的clickhouse 命令执行shell脚本 idea连接 命令执行 参考官网 # 下载脚本 wget https://raw.githubusercontent.com/183461750/doc-record/d988dced891d70b23c153a3bbfecee67902a3757/middleware/data/clickhouse/clickhouse-install.sh # 执行安装脚本(中…

【漏洞复现】Netgear WN604 downloadFile.php 信息泄露漏洞(CVE-2024-6646)

0x01 产品简介 NETGEAR WN604是一款由NETGEAR(网件)公司生产的无线接入器(或无线路由器)提供Wi-Fi保护协议(WPA2-PSK, WPA-PSK),以及有线等效加密(WEP)64位、128位和152…

亲测--linux下安装ffmpeg最新版本---详细教程

下载地址 Download FFmpeg 下载最新的https://ffmpeg.org/releases/ffmpeg-7.0.1.tar.xz 上传到服务器 解压 tar xvf ffmpeg-7.0.1.tar.xz 编译 cd ffmpeg-7.0.1 ./configure --prefix=/usr/local/ffmpeg make && make install 报错: 解决:在后面加 跳过检测…

【Word】——小技巧

1.PDF相关转换word PDF转换成Word在线转换器 - 免费 - CleverPDF 2. word插入公式 1.软件推荐(免费) 可直接将图片,截屏公式转为word标准规范形式 2.网址推荐 在线LaTeX公式编辑器-编辑器 (每天有免费使次数) 3.…

Matlab演示三维坐标系旋转

function showTwo3DCoordinateSystemsWithAngleDifference() clear all close all % 第一个三维坐标系 origin1 [0 0 0]; x_axis1 [1 0 0]; y_axis1 [0 1 0]; z_axis1 [0 0 1];% 绕 x 轴旋转 30 度的旋转矩阵 theta_x 30 * pi / 180; rotation_matrix_x [1 0 0; 0 cos(th…

Linux服务器配置Python+PyTorch+CUDA深度学习环境

参考博主 Linux服务器配置PythonPyTorchCUDA深度学习环境_linux cuda环境配置-CSDN博客 https://blog.csdn.net/NSJim/article/details/115386936?ops_request_misc&request_id&biz_id102&utm_termlinux%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83%E6%8C%89pytorch%20…

4核16G服务器支持多少人?4C16G服务器性能测评

租赁4核16G服务器费用,目前4核16G服务器10M带宽配置70元1个月、210元3个月,那么能如何呢?配置为ECS经济型e实例4核16G、按固定带宽10Mbs、100GB ESSD Entry系统盘。 那么问题来了,4C16G10M带宽的云服务器可以支持多少人同时在线&…