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

相关推荐

  1. AI:107-基于深度学习的图像识别—详细讲解

    2024-07-18 13:40:04       64 阅读
  2. Python学习-九大数据类型整合,详细讲解

    2024-07-18 13:40:04       18 阅读
  3. python 学习笔记20 批量修改页眉

    2024-07-18 13:40:04       51 阅读
  4. PYTHON 120道题目详解100-102

    2024-07-18 13:40:04       44 阅读
  5. 【软测学习笔记Python 教程(1)

    2024-07-18 13:40:04       28 阅读
  6. python+ opencv(Mat)——笔记

    2024-07-18 13:40:04       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 13:40:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 13:40:04       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 13:40:04       58 阅读
  4. Python语言-面向对象

    2024-07-18 13:40:04       69 阅读

热门阅读

  1. 基于opencv的图片加水印实现方案

    2024-07-18 13:40:04       20 阅读
  2. redis知多少

    2024-07-18 13:40:04       22 阅读
  3. 【LeetCode 0069】【二分查找】求平方根

    2024-07-18 13:40:04       22 阅读
  4. 密码学原理精解【8】

    2024-07-18 13:40:04       19 阅读
  5. 中电金信-杭州工商银行|面试真题|2024年

    2024-07-18 13:40:04       22 阅读
  6. Vue学习---vue 防抖处理函数,是处理什么场景

    2024-07-18 13:40:04       22 阅读
  7. k8s logstash多管道配置

    2024-07-18 13:40:04       20 阅读