首页 > 编程语言 >Python学习笔记—100页Opencv详细讲解教程

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

时间:2024-07-17 11:57:59浏览次数:13  
标签:... 窗口 img Python cv2 Opencv key 100 EVENT

目录

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:
    # 读每一帧数据,返回标记和这一帧数据frame,True表示读到了数据,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:

    # 读每一帧数据,返回标记和这一帧数据frame,True表示读到了数据,False表示没读到数据

    ret,frame = vc1.read()  # ret表示标记,frame表示图片



    # 可以根据ret做个判断

    if not ret:

        # 没有读到数据

        break

    # 显示窗口

    cv2.imshow('video',frame)



    # 退出条件

    key = cv2.waitKey(1000//30) #每帧图片之间的间隔时间ms(30帧,每帧之间隔多久)


    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是上面setMouseCallback的userdata

鼠标事件:

  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控件,value为trackbar的默认值,count为bar的最大值,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')

标签:...,窗口,img,Python,cv2,Opencv,key,100,EVENT
From: https://blog.csdn.net/weixin_55144746/article/details/140489615

相关文章

  • python--实验12 文件
    目录知识点第一部分:文件概述第二部分:文件的基本操作第三部分:目录管理第四部分:CSV文件读写第五部分:openpyxl等模块小结实验知识点第一部分:文件概述文件标识:找到计算机中唯一确定的文件。组成包括文件路径、文件名主干和文件扩展名。文件类型:区分了文本文件和二进......
  • python 导入时与运行时
    转载自我自己的github博客——>半天钟的博客元编程相关博文的目录及链接这篇博文是元编程系列博文中的其中一篇、这个系列中其他博文的目录和连接见下:使用python特性管理实例属性浅析python属性描述符(上)浅析python属性描述符(下)python导入时与运行时python元......
  • 0基础学python-15:封装、继承和多态
    目录前言 一、封装(Encapsulation)私有变量: 二、继承(Inherit) 三、多态(Polymorphism)总结前言        封装、继承和多态是面向对象编程的三大基本特性,它们与面向对象编程(OOP)密切相关。  一、封装(Encapsulation)概念:封装指的是将数据(属性)和操作数据的方法......
  • 【python学习】第三方库之pandas库的定义、特点、功能、使用场景和代码示例
    引言pandas是一个强大的Python库,用于数据分析和数据处理。它基于NumPy,提供了灵活的数据结构(Series和DataFrame)和数据操作功能,是数据科学和机器学习中不可或缺的工具文章目录引言一、安装`pandas`第三方库二、`pandas`的定义三、特点3.1强大的数据结构3.2灵活的数据......
  • 【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序
    ✨✨欢迎大家来到景天科技苑✨✨......
  • 自动化测试-RobotFramework环境准备(python基础)
    学习总结,有错误欢迎指出。总结:推荐为每个python相关项目创建独立的虚拟环境。1.虚拟环境安装虚拟环境:为每个项目提供独立的执行器和包管理。示例:使用python内置库venv模块,在项目根目录下创建虚拟环境。python-mvenv.venv-m:执行“位于搜索路径(sys.path)下......
  • Python办公自动化:效率飞跃,自动化批量汇总Excel到Word
    Python办公自动化:效率飞跃,自动化批量汇总Excel到Word原创 丹心向阳 数海丹心 2024年06月23日07:30 山东摘要:每个月底,是许多数据分析师的梦魇,尤其是当他们需要从成百上千的Excel报表中汇总数据到Word时。本文将讲述小李如何使用Python自动化技术,几秒钟完成原本需要通宵达旦......
  • Python自动化:智能对比Word文档,秒速锁定差异!
    Python自动化:智能对比Word文档,秒速锁定差异!原创 丹心向阳 数海丹心 2024年06月28日07:00 山东摘要:在我们的工作和学习中,经常需要对文档进行多次修改,如何快速准确地识别文档的最终版本,一直是让人头疼的问题。本文将介绍一种Python自动化技术,它可以自动对比两个Word文档之间......
  • Python自动化:10行代码免费解锁抖音、快手、小红书平台资源,无水印视频一键下载
    Python自动化:10行代码免费解锁抖音、快手、小红书平台资源,无水印视频一键下载原创 丹心向阳 数海丹心 2024年06月19日07:30 山东摘要:抖音、快手、小红书作为国内顶尖的短视频和娱乐平台,汇聚了巨大的流量和丰富的创意内容。对于自媒体从业人员而言,这些平台上的灵感和视频资......
  • 【python】Enum 枚举类
    Enum枚举类[1]Enum是一组与互不相同的值分别绑定的符号名,类似于全局变量。因为枚举通常表示常量,所以建议枚举成员命名时采用大写。定义类定义classColor(Enum):#classsyntaxRED=1GREEN=2BLUE=3方法定义Color=Enum('Color',['RED','GRE......