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…

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

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

css font 优化

文章目录 使用 font-display 控制字体加载预加载关键字体选择合适的字体文件类型按需创建字体文件HTTP 缓存优化 使用 font-display 控制字体加载 避免字体加载导致的空白 block:浏览器在短暂的阻塞期内不显示任何文本,直到字体加载完成。这可能导致页…

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…

如何配置Memcached以减少对数据库的直接访问

如何配置Memcached以减少对数据库的直接访问 1. 引言 在现代应用程序中,数据库通常是性能瓶颈的主要来源之一。通过使用Memcached,开发者可以显著减少数据库的负载,提高应用程序的响应速度。本文将详细介绍如何配置Memcached,以…

UE4-字体导入

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

odoo17创建一个默认UI视图

XML 数据文件 当要加载的数据具有简单格式时,CSV 格式很方便。当格式更复杂时(例如,加载视图或电子邮件模板的结构),我们使用 XML 格式。例如,此帮助字段包含 HTML 标记。虽然可以通过 CSV 文件加载此类…

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

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

极致竞争思维

老板请了几个毕业生,培训了一年,他们现在对业务的熟悉程度比我都熟悉多了,只是基本功不扎实,做出来的东西有很多问题。 老板请我来,给了我一个硬件总监的位置,实际上是要对他的整个系统做出诊断。 也是难为…

【QT】线程控制和同步

目录 概述 QThread常用API 线程使用 创建一个QThread的子类 主线程启动线程 线程安全 互斥锁 QMutex 使用示例:两个线程一个共享静态变量进行 线程子类创建 主线程调用 QMutexLocker 条件变量 信号量 概述 在 Qt 中,多线程的处理⼀般是…

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

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

【proteus经典实战】定时器控制交通灯指示灯

一、简介 基于8051系列单片机实现,旨在模拟一个简单的交通灯系统,实现红、黄、绿灯的交替亮灭。使用了特殊功能寄存器(SFR)和位操作来控制硬件,使用定时器0的中断功能来控制交通灯信号的切换。通过软件控制&#xff0…

解决selenium打印保存为PDF时图片未加载成功的问题

使用selenium打印网页时,如果程序运行很快的话,可能会导致图片没有加载成功即进行了保存,出现这个问题最初的思考是在执行打印任务时使用js进行强制等待,后发现实现效果并不好。在加载页面时使用自动下滑的方式将网页拉到底&#…

uniapp动态计算并设置元素高度

<template><view><scroll-view id"sv-box" :scroll-y"true" :style"{height:navHeightpx}"></scroll-view><view id"btn-box"><button>取消</button><button>确认</button><…

Linux Vim教程(三):插入模式与命令模式

目录 1. Vim的基本模式介绍 2. 插入模式 2.1 进入插入模式 2.2 退出插入模式 2.3 插入模式下的快捷键 2.4 插入模式中的光标移动 3. 命令模式 3.1 进入命令模式 3.2 常用命令 3.3 搜索和替换 3.4 其他有用的命令 3.5 配置与优化 3.5.1 自动补全 3.5.2 自定义快捷…

【前后端联调】HttpMessageNotReadableException

【前后端联调】HttpMessageNotReadableException 01 问题描述 在前后端联调时产生的问题&#xff0c;关键是下面这句翻译JSON解析错误&#xff1a;无法构造“java.util.ArrayList”的实例 org.springframework.http.converter.HttpMessageNotReadableException: JSON parse …

记录贴-NGINX相关

链接: NGINX相关配置信息说明

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

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