OpenCv学习笔记(上)

一、学习环境安装

本次学习,学习环境使用Jupyter,跟随B站up主Python大本营进行一段时间的学习
进入围我的电脑这个位置,E:\OpenCv\venv\Scripts -> 输入cmd进入虚拟环境 -> 输入activate -> cd …/… (左右都是两个点,打不出来)-> 输入 juypter notebook,进入学习环境开始学习

二、图像和视频的加载和显示

2.1 窗口的创建和关闭

在这里插入图片描述

函数名功能

图像和视频的加载和显示

import cv2 
cv2.namedWindow('window',cv2.WINDOW_NORMAL)
cv2.resizeWindow('window',800,600)
cv2.imshow('window',0)
#等待按键
cv2.waitKey()
if key==ord('q'):

2.2图片的打开和关闭

import cv2
import matplotlib.pyplot as plt
import numpy as np
img=cv2.imread('./cat.jpg')
img

matplotlib打开的图颜色会不对
–Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。–

import matplotlib.pyplot as plt
plt.imshow(img)

图片打开和关闭的完整程序

import cv2 #导包
img=cv2.imread('./cat.jpg')
cv2.imshow('img',img)
key = cv2.waitKey(0)
if key == ord('1'):
    cv2.destroyAllWindows()

2.3保存图片

函数名功能
imwrite(‘path’,img)将img保存道某指定路径下
import cv2
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',900,900)
img = cv2.imread('./cat.jpg')
while True:
    cv2.imshow('img',img)
    key = cv2.waitKey(0)
    if(key == ord('1')):
        break
    elif(key == ord('2')):
        cv2.imwrite('./123.png',img)#保存图片,保存在某路径中
    else:
        print(key)
cv2.destroyAllWindows()

在这里插入图片描述

2.4摄像头的打开和关闭

函数名功能
VideoCapture(‘flags’)打开设备的摄像头或视频
ret, frame = cap.read()参数ret True 或者False,代表有没有读取到图片第二个参数frame表示截取到一帧的图片

'flags’为0时,打开设备的摄像头,'flags’为文件名时,打开视频

#打开摄像头
import cv2
cv2.namedWindow('video',cv2.WINDOW_NORMAL)#打开一个窗口,以正常的方式打开
cv2.resizeWindow('video',640,480)#打开的窗口的大小
cap = cv2.VideoCapture(0)
while True:
    #读一帧数据,返回标记,True和Flase
    ret,frame = cap.read()
    # ret, frame = cap.read()返回值含义:参数ret True 或者False,代表有没有读取到图片第二个参数frame表示截取到一帧的图片
    #根据ret做一个判断
    if not ret:
        break
    cv2.imshow('video',frame)#在窗口中显示图像,将‘frame’图像显示在‘video’窗口中
    key=cv2.waitKey(100)#每100ms读取键盘的一个值
    if(key == ord('1')):
        break
cap.release()#释放或图片视频
cv2.destroyAllWindows()#销毁所有窗口
#打开视频
import cv2
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)
cap = cv2.VideoCapture('./1.mp4')
while True:
    #读一帧数据,返回标记,True和Flase
    ret,frame = cap.read()
    #根据ret做一个判断
    if not ret:
        break
    cv2.imshow('video',frame)
    key=cv2.waitKey(34)
    if(key == ord('1')):
        break
cap.release()
cv2.destroyAllWindows()

注意上面的代码, "key=cv2.waitKey(34)"为什么waitKey中为什么写的是34呢,视频其实就是一张张图片的顺序播放,但是该视频的帧率为30,所以设置每隔34ms进行一次图片切换,这样视频便以正常速度进行播放了
学习心得:OpenCv的学习主要是学习每一个函数的功能和对函数的运用,程序的编辑并不难

2.5 视频录制

VideoWriter():这个函数为视频的保存,其中有四个参数,参数1为输出文件,参数2为VideoWriter_fourcc,参数3为帧率,参数4为分辨率
该函数的四个参数不可随意编辑,需要与你的录制的视频相同,一般情况下,帧率为20,分辨率为(640×480)
writer 编码并写入缓存
release缓存内容写入磁盘,并释放资源

#视频的录制
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc('M','P','A','V')
#(640,480)表示摄像头拍视频的分辨率,这个大小搞错也不行,我得电脑是这个分辨率
vw = cv2.VideoWriter('output.mp4',fourcc,20,(640,480))
while cap.isOpened():
    ret,frame = cap.read()
    if not ret:
        print('can not recive frame,Exiting...')
        break
    vw.write(frame)
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) == ord('q'):
        break
#记得释放资源
cap.release
vm.release()
cv2.destroyAllWindows()

2.6 控制鼠标

控制鼠标的函数主要有两个,setMouseCallback(winname,callback,userdate),winname为窗口名字,callback为回调函数,userdate为回调函数的参数
callback(event,x,y,flags,userdata)回调函数必须包含这五个参数
在这里插入图片描述

import cv2
import numpy as np
def mouse_callback(event,x,y,flags,userdate):
    print(event,x,y,flags,userdate)
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse',640,360)
cv2.setMouseCallback('mouse',mouse_callback,'123')
#生成一个全黑的图片,行列需要对应好
img= np.zeros((360,640,3),np.uint8)
while True:
    cv2.imshow('mouse',img)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
cv2.destroyAllWindows()

上面的这一段代码用到了np.zeros()
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,一般在python中我们会对Numpy进行缩写,import numpy as np,因此后续中的np均指numpy
np.zeros()函数的作用:
np.zeros()函数返回一个元素全为0且给定形状和类型的数组:
zeros(shape, dtype=float, order=‘C’)
1.shape:形状
2.dtype:数据类型,可选参数,默认numpy.float64
3.order:可选参数,c代表与c语言类似,行优先;F代表列优先

2.7 TrackBar

两个生成TrackBar控件的函数
在这里插入图片描述

生成一个调色器,具体代码如下

import cv2
import numpy as np
cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar',640,480)
def callback(value):
    print(value)
cv2.createTrackbar('R','trackbar',0,255,callback)
cv2.createTrackbar('G','trackbar',0,255,callback)
cv2.createTrackbar('B','trackbar',0,255,callback)
#创建背景图片
img = np.zeros((480,640,3),np.uint8)
while True:
    r=cv2.getTrackbarPos('R','trackbar')
    g=cv2.getTrackbarPos('G','trackbar')
    b=cv2.getTrackbarPos('B','trackbar')
    #用获取到的三个值修改图片的背景颜色
    img[:]=[b,g,r]
    cv2.imshow('trackbar',img)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
cv2.destroyAllWindows()

2.8 ROI区域

将感兴趣的区域留下来,用切片操作即可

import cv2
cv2.namedWindow('cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('cat',880,480)
img = cv2.imread('cat.jpg')
img = img[50:200,50:200]#这句代码,将想要的感性区域留下来了
cv2.imshow('cat',img)
key = cv2.waitKey(0)
cv2.destroyAllWindows()

3

3.1 RGB和BGR颜色空间

OpenCv中,颜色默认为蓝绿红(B,G,R)

3.2 HSV和HSL和YUV

HSV图像如下:
H色相
S饱和度
V明度
在这里插入图片描述
HSL:
H色相
S饱和度
L亮度
在这里插入图片描述

3.3色彩空间的转化

几个函数
cv2.createTrackbar()生成窗口的函数,参数有5个,函数的第一个参数时滑动条的名字,第二个参数时滑动条被放置的窗口的名字,第三个参数是滑动条默认值,第四个参数时滑动条的最大值,第五个参数时回调函数,每次滑动都会调用回调函数。

cv2.getTrackbarPos()
第一个:滑动条名 第二个:窗口名
返回值:指定窗口上指定滑动条的当前位置

cv2.cvtColor()
颜色空间转化函数

import cv2
def callback(value):
    pass
cv2.namedWindow('color',cv2.WINDOW_NORMAL)
cv2.resizeWindow('color',680,480)
img = cv2.imread('./cat.jpg')
colorspaces = [cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2BGRA,cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2HSV,cv2.COLOR_BGR2YUV]
cv2.createTrackbar('curcolor','color',0,4,callback)
while True:
    index = cv2.getTrackbarPos('curcolor','color')
    cvt_img = cv2.cvtColor(img,colorspaces[index])
    cv2.imshow('color',cvt_img)
    key = cv2.waitKey(10)
    if key == ord('q'):
        break
cv2.distroyAllWindows()

3.4 MAT的深浅拷贝

浅拷贝,img.view()相当于给数据增加了一个指针,通过这个指针调用原来的数据
深拷贝,img.copy()开辟了一块新的空间,对数据进行存储,与原始数据没有联系

3.5 访问图像的mat属性

import cv2
import numpy as np
img = cv2.imread('cat.jpg')
print(img.shape)
print(img.size)
print(img.dtype)

shape 返回图像的高度,长度,通道数
size 返回图像占用多大的空间 (高度长度通道数)
dtype返回每个像素的所占用空间

3.6 通道的合并和分离

通过spilt函数和merger函数,可以对一幅多通道的函数进行分离合并的操作
分离通道 b,g,r=cv2.split(img)
合并通道 cv2.merge((b,g,r))

4 图像的绘制

利用OpenCv提供的绘制图形API可以在图像上进行绘制
本章主要学习绘图的函数的使用
(这一部分我先不学)

5图像的基本运算

5.1 加减乘除

加:cv2.add(‘img_1’,‘img_2’)
将img_1和img_2的像素点,逐个相加,超过255的部分,默认为255

减:cv2.subtract(‘img_1’,‘img_2’)
对应元素相减,小于0的部分,变为0

乘: cv2.multipl(‘img_1’,‘img_2’)
对应元素相乘,大于255的部分,变为255

除:cv2.divide(‘img_1’,‘img_2’)
对应元素相除

#加减乘除
import cv2 
import numpy as np
cat=cv2.imread('cat.jpg')
dog=cv2.imread('dog.jpg')
print(cat.shape)
print(dog.shape)
new_dog=dog[:400,:400]
img_add=cv2.add(new_dog//2,cat//2)
cv2.imshow('img_add',img_add)
key = cv2.waitKey(0)
if key == ord('q'):
       cv2.destroyAllWindows()

5.2 图像的融合

不是简单的加减乘除,对图片进行了线性的运算
cv2.addWeighted(‘img1’,‘proportion_1’,‘img2’,‘proportion_’,‘bisa’):一个让两个图片进行线性运算的公式

#加减乘除
import cv2 
import numpy as np
cat=cv2.imread('cat.jpg')
dog=cv2.imread('dog.jpg')
print(cat.shape)
print(dog.shape)
new_dog=dog[:400,:400]
img_add=cv2.add(new_dog//2,cat//2)
cv2.imshow('new_img',np.hstack((cat,new_dog,img_add)))
key = cv2.waitKey(0)
if key == ord('q'):
       cv2.destroyAllWindows()

在这里插入图片描述

5.3 OpenCv的位运算

与运算: new_and=cv2.bitwise_and(cat,new_dog)
图片越来越亮

或运算:new_or=cv2.bitwise_or(cat,new_dog)
图片越来学暗

异或运算:new_xor=cv2.bitwise_xor(cat,new_dog)

非运算: new_not=cv2.bitwise_not(cat)

#位运算
import cv2 
import numpy as np
cat=cv2.imread('cat.jpg')
dog=cv2.imread('dog.jpg')
#print(cat.shape)
#print(dog.shape)

new_dog=dog[:400,:400]
dog=cv2.imread('dog.jpg')
new_and=cv2.bitwise_and(cat,new_dog)
new_or=cv2.bitwise_or(cat,new_dog)
new_xor=cv2.bitwise_xor(cat,new_dog)
new_not=cv2.bitwise_not(cat)
cv2.imshow('new_img',np.hstack((cat,new_dog,new_and,new_or,new_xor)))
key = cv2.waitKey(0)
if key == ord('q'):
       cv2.destroyAllWindows()

6 图像的基本变换

6.1 图像的放大与缩小

可以对图像进行非常灵活的变化
resize(src,desize[,[dst[,fx[,fy[,interpolation]]]]])
在这里插入图片描述

#resize
import cv2
import numpy as np
cat=cv2.imread('cat.jpg')
dog=cv2.imread('dog.jpg')
print(dog.shape)
new_dog=cv2.resize(dog,(600,600),interpolation=cv2.INTER_AREA)
cv2.imshow('new_dog',new_dog)
key = cv2.waitKey(0)
if key == ord('q'):
       cv2.destroyAllWindows()

6.2 图片的反转和旋转

1.翻转
cv2.flip(src, flipCode[, dst])
scr:变换操作的输入图像
flipCode:控制参数,整型(int),flipCode>0 水平翻转,flipCode=0 垂直翻转,flipCode<0 水平和垂直翻转
dst:变换操作的输出图像,可选项

2.旋转
用下面这个函数就行,不多说了
在这里插入图片描述

6.3 仿射变换

通过,warpAffine(src,M,dsize),可以对图片进行变换,很灵活

在这里插入图片描述

import cv2
import numpy as np
dog=cv2.imread('dog.jpg')
h,w,ch = dog.shape
M=np.float32([[1,0,200],[0,1,0]])
new_dog = cv2.warpAffine(dog,M,dsize=(w,h))
cv2.imshow('dog',dog)
cv2.imshow('new_dog',new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

6.4 仿射变换之获取变换矩阵

在进行旋转操作时,计算非常困难,opencv提供了一个函数进行变换矩阵的获取
getRotationMatrix2D(center,angle,scacle)
center 中心点,以图片的那个点作为旋转的中心点
angle 旋转的角度,按照逆时针方向旋转
scale 缩放比例,想把图片进行什么样的缩放

6.5 透视变换

即坐标系的变换
如,斜的图片变正
变换矩阵函数:getPerspectiveTransfrom(src,dst)获取变换的变换矩阵,需要四个点,即图片的四个角
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值