最近在做一些实验,需要画图和对图像进行处理,所以用到  plt 库和  cv2 的库比较多

所以做点笔记

函数介绍

1、读入图像函数

cv2.imread(filepath,flags)

参数一是想要读取图片的路径,参数二是值想要读取图片的格式

  • filepath:要读入图片的完整路径
  • flags:读入图片的标志 
    • cv2.IMREAD_COLOR:默认参数,加载彩色图片,可以直接写1。
    • cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。
    • cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道,可以直接写-1。
import cv2
img = cv2.imread('AD.jpg',cv2.IMREAD_GRAYSCALE)

2、显示图像函数

cv2.imshow(wname,img)

第一个参数是显示图像的窗口的名字,第二个参数是要显示的图像(imread读入的图像),窗口大小自动调整为图片大小

参数1:需要载入图片的路径名,例如“C:/daima practice/opencv/mat3/mat3/image4.jpg”

参数2:加载图像的颜色类型。默认为1.  若为0则灰度返回,若为1则原图返回。

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#dv2.destroyWindow(wname)
  • cv2.waitKey顾名思义等待键盘输入,单位为毫秒,即等待指定的毫秒数看是否有键盘输入,若在等待时间内按下任意键则返回按键的ASCII码,程序继续运行。若没有按下任何键,超时后返回-1。参数为0表示无限等待。不调用waitKey的话,窗口会一闪而逝,看不到显示的图片。
  • cv2.destroyAllWindow()销毁所有窗口
  • cv2.destroyWindow(wname)销毁指定窗口

3、图片显示时长设置函数

cv2.waitKey(time)

唯一一个参数是在一个给定的时间内(单位ms)等待用户按键触发;如果用户没有按下键,则接续等待(循环)

常见:设置waitKey(0),则表示程序会无限制的等待用户的按键事件一般在imgshow的时候,如果设置waitKey(0),代表按任意键继续

显示视频时,延迟时间需要设置为 大于0的参数   delay>0时,延迟”delay”ms,在显示视频时这个函数是有用的,用于设置在显示完一帧图像后程序等待”delay”ms再显示下一帧视频;如果使用waitKey(0)则只会显示第一帧视频

import time
import cv2img = cv2.imread('AD.jpg')
cv2.imshow('图片',img)
# cv2.waitKey(1000)
cv2.waitKey(1)
# cv2.waitKey(0)
#time.sleep(1)

实际上,waitkey控制着imshow的持续时间,当imshow之后不跟waitkey时,相当于没有给imshow提供时间展示图像,所以只有一个空窗口一闪而过。添加了waitkey后,哪怕仅仅是cv2.waitkey(1),我们也能截取到一帧的图像。所以cv2.imshow后边是必须要跟cv2.waitkey的。

给一段imshow源码里的注释来印证下:This function should be followed by cv::waitKey function which displays the image for specified . milliseconds. Otherwise, it won't display the image.

非官方翻译:这个函数之后应接cv2.waitKey函数来显示指定图像。否则,它不会显示图像。
为什么要这么麻烦的设计

来自官方的解释:This function is the only method in HighGUI that can fetch and handle events, so it needs to be .

非官方翻译:这个函数是HighGUI窗口中唯一的获取和处理事件的方法,因此它必须存在。
cv2.waitKey(1000) & 0xFF == ord(‘q’) 是什么意思

先解释下字面意思:

cv2.waitKey(1000):在1000ms内根据键盘输入返回一个值
    0xFF :一个十六进制数
    ord('q') :返回q的ascii码

0xFF是一个十六进制数,转换为二进制是11111111。waitKey返回值的范围为(0-255),刚好也是8个二进制位。那么我们将 cv2.waitKey(1) & 0xFF计算一下(不知怎么计算的可以百度位与运算)发现结果仍然是waitKey的返回值,那为何要多次一举呢?直接 cv2.waitKey(1) == ord('q')不就好了吗。

实际上在linux上使用waitkey有时会出现waitkey返回值超过了(0-255)的范围的现象。通过cv2.waitKey(1) & 0xFF运算,当waitkey返回值正常时 cv2.waitKey(1) = cv2.waitKey(1000) & 0xFF,当返回值不正常时,cv2.waitKey(1000) & 0xFF的范围仍不超过(0-255),就避免了一些奇奇怪怪的BUG。
cv2.waitkey和time.sleep的区别

肯定有人写在代码时把waitkey当sleep用过,你会发现有时waitkey并不起作用。

先来一段官方解释:The function only works if there is at least one HighGUI window created and the window is active

非官方翻译:这个函数只有在至少一个HighGUI窗口存在的情况下才会起作用。

也就是说waitkey的延时机制是有条件的,必须在它之前创造HighGUI窗口它才会起作用。而time.sleep是无条件的延时机制。

那么cv2.waitKey能不能代替time.sleep在cv2.imshow心中的地位呢?

答案很清楚:不能。

4、保存图像函数

cv2.imwrite(file,img,num)

第一个参数是要保存的文件名,第二个参数是要保存的图像。可选的第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3.

  • cv2.IMWRITE_JPEG_QUALITY类型为 long ,必须转换成 int
  • cv2.IMWRITE_PNG_COMPRESSION, 从0到9 压缩级别越高图像越小。
cv2.imwrite('AD.png',img, [int( cv2.IMWRITE_JPEG_QUALITY), 95])
cv2.imwrite('AD.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])

5、图片翻转操作函数

cv2.flip(img,flipcode)

第一个参数是要翻转的图像,第二个参数是控制翻转的效果

  • flipcode = 0:沿x轴翻转
  • flipcode > 0:沿y轴翻转
  • flipcode < 0:x,y轴同时翻转
imgflip = cv2.flip(img,1)

6、颜色空间转换函数

cv2.cvtColor(img,flag)

第一个参数是要转换颜色的图像,第二个参数是转换成什么格式的图像

# cv2.COLOR_X2Y,其中X,Y = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS

#彩色图像转为灰度图像
img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
#灰度图像转为彩色图像
img3 = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)
# cv2.COLOR_X2Y,其中X,Y = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS
imgcopy = img.copy()   #这个函数是图像复制

7、图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数

图像的旋转矩阵一般为:

cv2.getRotationMatrix2D(center, angle, scale)

但是单纯的这个矩阵是在原点处进行变换的,为了能够在任意位置进行旋转变换,opencv采用了另一种方式:

为了构造这个矩阵,opencv提供了一个函数:

M = cv2.getRotationMatrix2D(center, angle, scale)

此函数主要用于获得图像绕着某一点的旋转矩阵,这个函数需要三个参数,旋转中心,旋转角度,旋转后图像的缩放比例。返回一个2*3矩阵,主要用于cv2.warpAffine()仿射变换。

parameters

center:旋转中心坐标,是一个元组参数(col, row)

angle:旋转角度,旋转方向,负号为逆时针,正号为顺时针

scale:旋转后图像相比原来的缩放比例,1为等比例缩放

returns 获得一个旋转矩阵

代码:

import cv2
import numpy as npimg = cv2.imread('aier.jpg')  # 读入图像,(H, W, C)
rows,cols = img.shape[:2]     # 取前两个值(H,W)# 第一个参数旋转中心,第二个参数旋转角度,第三个参数:缩放比例, 生成一2*3的矩阵center = (cols/2, rows/2)  # 以图像中心为旋转中心
angle = 90                 # 顺时针旋转90°
scale = 1                  # 等比例旋转,即旋转后尺度不变    M = cv2.getRotationMatrix2D(center, angle, scale)print(M)'''
[[ 6.123234e-17  1.000000e+00  1.500000e+02][-1.000000e+00  6.123234e-17  6.500000e+02]]
'''

cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue)

cv2.warpAffine()函数主要是利用变换矩阵M对图像进行如旋转、仿射、平移等变换,只需要我们提供一个2*3的变换矩阵M,就可以对图像进行变换。它一般是和cv2.getRotationMatrix2D和cv.GetAffineTransform两个函数在一起使用,这两个函数是用来获取变换矩阵M,这样就不需要我们自己设置M。

cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue) → dst
参数 含义
src 输入图像,可以为单通道或彩色图像
M 变换矩阵,一般反映平移或旋转的关系,为InputArray类型的2×3变换矩阵。
dsize 输出图像的大小
dst 仿射变换后的输出图像
flags 插值方法的组合(int 类型),默认为 flags=cv2.INTER_LINEAR,表示线性插值
borderMode 边界像素模式(int 类型)
borderValue 边界填充值; 默认情况下,它为0,也就是边界填充默认是黑色。

一般使用前三个参数,其中flags表示插值方式,有以下取值:

flags取值 含义
cv2.INTER_LINEAR 线性插值(默认)
cv2.INTER_NEAREST 最近邻插值
cv2.INTER_AREA 区域插值
cv2.INTER_CUBIC 三次样条插值
cv2.INTER_LANCZOS4 Lanczos插值

图像旋转的通用写法

import cv2
import random# 定义旋转函数
def ImageRotate(image):height, width = image.shape[:2]    # 输入(H,W,C),取 H,W 的值center = (width / 2, height / 2)   # 绕图片中心进行旋转angle = random.randint(-180, 180)  # 旋转方向取(-180,180)中的随机整数值,负为逆时针,正为顺势针scale = 0.8                        # 将图像缩放为80%# 获得旋转矩阵M = cv2.getRotationMatrix2D(center, angle, scale)# 进行仿射变换,边界填充为255,即白色,默认为0,即黑色image_rotation = cv2.warpAffine(src=image, M=M, dsize=(height, width), borderValue=(255, 255, 255))return image_rotation

实例

# opencv实现图像旋转实例
import cv2
import random
import matplotlib.pylab as plt# 定义旋转函数
def ImageRotate(image):height, width = image.shape[:2]    # 输入(H,W,C),取 H,W 的zhicenter = (width / 2, height / 2)   # 绕图片中心进行旋转angle = random.randint(-180, 180)  # 旋转方向取(-180,180)中的随机整数值,负为逆时针,正为顺势针scale = 0.8                        # 将图像缩放为80%# 获得旋转矩阵M = cv2.getRotationMatrix2D(center, angle, scale)# 进行仿射变换,边界填充为255,即白色,默认为黑色image_rotation = cv2.warpAffine(src=image, M=M, dsize=(height, width), borderValue=(255, 255, 255))return image_rotationimage = cv2.imread('../DAVIS-2016/JPEGImages/1080p/blackswan/00004.jpg')
image = cv2.resize(image, (224, 224))
image_rotation = ImageRotate(image)plt.subplot(1, 2, 1)
plt.imshow(image)
plt.subplot(1, 2, 2)
plt.imshow(image_rotation)
plt.show()

result:

  • 顺时针

  • 逆时针

图片旋转过后变换图片的大小

代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : 图片合成.py
# @Author: 0moyi0
# @Date  : 2021/10/30import cv2
import mathdef rotate_bound(image, angle):# (h, w) = image.shape[:2](h, w) = image.shape(cX, cY) = (w // 2, h // 2)# 计算变换矩阵,参数一次表示(旋转中心,旋转角度,缩放因子),其中旋转角度正为逆时针M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)print(M)# 为了使旋转后的图片完全显示,所以需要调整输出图片的大小nH = int(abs(h * math.cos(math.radians(angle))) + abs(w * math.sin(math.radians(angle))))nW = int(abs(h * math.sin(math.radians(angle))) + abs(w * math.cos(math.radians(angle))))# 调整旋转矩阵以考虑旋转M[0, 2] += (nW / 2) - cXM[1, 2] += (nH / 2) - cY# 计算旋转后的图片并输出return cv2.warpAffine(image, M, (nW, nH))if __name__ == '__main__':# 读取并显示原图img = cv2.imread('img140.png', 0)'''使用函数cv2.imread(filepath,flags)读入一副图片filepath:要读入图片的完整路径flags:读入图片的标志 cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道cv2.IMREAD_GRAYSCALE:读入灰度图片cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道'''print(img.shape)cv2.imshow('origin', img)cv2.waitKey()# 计算并输出旋转后的图片img = rotate_bound(img, 15)print(img.shape)cv2.imshow('rote', img)cv2.waitKey()

旋转前原图

旋转15度后

参考博客

模块cv2的用法 - 陨落&新生 - 博客园
Opencv:图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数_宁静致远*的博客-CSDN博客

旋转变换,变换后改变图片大小_Diana_Z的博客-CSDN博客
cv2.waitKey的入门级理解_山上有强强的博客-CSDN博客_cv2.waitkey

cv2库中一些函数的使用相关推荐

  1. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

  2. Py之Numpy:Numpy库中常用函数的简介、应用之详细攻略

    Py之Numpy:Numpy库中常用函数的简介.应用之详细攻略 目录 Numpy库中常用函数的简介.应用 1.X, Y = np.meshgrid(X, Y) 相关文章 Py之Numpy:Numpy库 ...

  3. CV之FD:基于dlib、cv2库利用warpPerspective函数和_68_face_landmarks文件实现AI换脸渐变融合视频效果

    CV之FD:基于dlib.cv2库利用warpPerspective函数和_68_face_landmarks文件实现AI换脸渐变融合视频效果 目录 输出结果 设计思路 输出结果 设计思路 实现代码 ...

  4. code::blocks自动补全诸如socket或者其它一些库中的函数

    如何让Ubuntu/winxp下面的code::blocks自动补全诸如socket或者其它一些库中的函数,宏之类的东西: 在project的parser里面将这些library的头文件包含进去即可, ...

  5. surprise库中evaluate函数弃用解决方法

    surprise库中evaluate函数弃用解决方法 代码:在数据集上测试效果 evaluate(self.svd, data, measures=['RMSE', 'MAE']) 运行报错:Impo ...

  6. python调用js库中的函数_Python 调用JS文件中的函数

    Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...

  7. 【资料】wpcap.dll/Packet.dll库中相应函数

    2019独角兽企业重金招聘Python工程师标准>>> 来自于<网络分析技术揭秘>前三章试读链接:http://book.2cto.com/201208/1359.htm ...

  8. XLL 框架库中的函数

    这个框架库,可以让编写 XLL 更加容易.包含了管理 XLOPER/XLOPER12 内存的简单函数,创建临时 XLOPER/XLOEPR12 ,强制调用回调函数 (Excel4,Excel4v,Ex ...

  9. pandas库中unique函数方法

    pandas库中unique方法 (1)函数介绍 unique方法可以进行对于一列数据进行去重,并返回所有不同的值.如我们对数据集的标签页进行使用该函数,就可以输出一共有多少种标签类型. (2)代码 ...

  10. python如何调用dll库中的函数_Python调用dll库接口-ctypes方法

    背景 最近需要用python写个脚本程序(win10 环境),需要调用现成的dll库完成这项任务,对于一直在Linux平台上开发程序的本人来说,从没有过使用dll的经历(不得不说还是so大法好),遇到 ...

最新文章

  1. 机器学习案例 特征组合——高帅富 冷启动——从微博等其他渠道搜集数据进行机器学习 用户年龄——线性分段处理...
  2. 学python比较好的书-学习Python编程的最好的几本书
  3. Ubuntu12.10 root用户登录设置
  4. 【uni-app】分享
  5. 日本字全角字符linux,Linux命令行输入全角字符被转化
  6. python map lambda 分割字符串_[转] Python特殊语法:filter、map、reduce、lambda
  7. 获取本机外网ip地址
  8. python编程函数_python函数式编程
  9. Shp上传至Oracle Spatial
  10. java 将cad文件转化成pdf或图片,实现在线预览
  11. bootbox.js——弹框插件
  12. 监控你的App使用行为
  13. php手册中的tokenizer详细总结,基本看它就够了
  14. python访问纯真IP数据库的代码
  15. python星星闪烁_python实现while循环打印星星的四种形状
  16. C# Control.Refresh的解释是什么意思?
  17. html5最新滚动效果,jQuery和CSS3炫酷滚动页面内容元素动画特效插件
  18. 137.Python修炼之路【142-前端-JQuery-jqueryUI】2018.08.04
  19. 小米MIUI备份/小米助手数据通过BAK进行恢复 | 生成MIUI的descript.xml文件进行数据恢复 | 手动恢复MIUI备份/小米助手数据
  20. pyltp依存句法分析_NLP(十二)依存句法分析的可视化及图分析

热门文章

  1. 号称“不限速“的阿里网盘,官宣要停止了,寿命仅仅1年
  2. vue结合高德地图V2.0(JSAPI key搭配代理服务器并携带安全密钥转发)
  3. 嘉楠科技:一家芯片创业公司的上云历程
  4. java布尔字段用is前缀_Javabean中,对于boolean类型的属性,可以使用is代替方法名称中的set和get前缀,创建Bean必须带有包名。...
  5. [书单]创意写作书 48本
  6. 微信小程序加入购物车动画
  7. Redis主从复制原理
  8. 腾讯和360之争所折射出的下作
  9. win10+Ubuntu18.04.2双系统双硬盘安装及分区
  10. 【第二节】HTML5小实例