CV2指的是OpenCV2(Open Source Computer Vision Library),是一个开源的库平台计算机视觉库。有很强大的图片处理功能,可实现图像处理和计算机视觉方面的很多通用算法。
OpenCV官网文档 https://docs.opencv.org/4.1.2/d6/d00/tutorial_py_root.html
中文文档http://www.woshicver.com/
特别提示:安装的时候用 opencv_python,但在导入使用的时候使用 cv2。
在Windows环境中Python模块(库、包)安装命令格式,在cmd中:
[py -X.Y -m] pip install [-i 镜像网址] 模块(库、包)名
其中[]部分表示可选的
若安装了多个python版本,X.Y代表Python版本,多余的部分舍弃如3.8.1取3.8,3.10.5取3.10,即只取第二个点前的部分。仅安装了一个python版本不需要。
使用镜像网址可以加快安装速度,常用的镜像网址
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:https://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
【参见https://blog.csdn.net/cnds123/article/details/104393385】
我这里使用 (安装了多个python版本 要为3.9.1版本安装cv2库——opencv_python,使用阿里云镜像。安装的时候是 opencv_python,但在导入的时候采用 import cv2。):
py -3.10 –m pip install -i https://mirrors.aliyun.com/pypi/simple/ opencv_python
参见下图:

最后,检测安装情况

注意:使用cv2库的时候,文件名和路径不能有中文,一旦有中文就会有各种莫名其妙的错误!
读入一张图片函数:cv2.imread(filepath,flags)
其中filepath表示图片的路径
flags表示要读入的是什么图片:
(1)cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道(或者直接写1)
(2)cv2.IMREAD_GRAYSCALE:读入灰度图片(或者直接写0)
显示一张图片函数:cv2.imshow(window_name, image)
其中,第一个参数是窗口的名字,第二个参数是要显示的图像
键盘绑定函数cv2.waitKey(delay)
其中delay 的单位为ms毫秒,当 delay 取大于0的值时,程序在给定的 delay 时间内等待用户按键触发关闭图形显示窗口,或等到时间到关闭图形显示窗口。若设置delay为0,则代表等待按任意键关闭图形显示窗口。
没有它,窗口会在程序完成是立即关闭图形显示窗口。
提示,脱离IDLE环境时才能看到此函数的效果,如双击py脚本文件运。
下面给出读入图片并显示之源码
import cv2
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
cv2.imshow("image1",image1)
cv2.waitKey(0)
运行之:

函数 cv2.imwrite() 用于将图像保存到指定的文件。
cv2.imwrite(filename, img [, paras])
参数说明:
filename:要保存的文件的路径和名称,包括文件扩展名
img:要保存的 OpenCV 图像,nparray 多维数组
paras:不同编码格式的参数,可选项
将彩色图片转成灰度图片保存

源码如下:
import cv2
image1=cv2.imread(r"D:/cv2Demo/lotus2.png",0)
cv2.imwrite(r"D:/cv2Demo/lotus2As.png",image1)
图像缩放函数cv2.resize(image, image2,dsize)
输入原始图像,输出新图像,图像的大小)
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
参数说明:
scr:变换操作的输入图像
dsize: 输出图像的大小,二元元组 (width, height)
dst:变换操作的输出图像,可选项
fx, fy:x 轴、y 轴上的缩放比例,实型,可选项
interpolation:插值方法,整型,可选项
cv2.INTER_LINEAR:双线性插值(默认方法)
cv2.INTER_AREA:使用像素区域关系重采样,缩小图像时可以避免波纹出现
cv2.INTER_NEAREST:最近邻插值
cv2.INTER_CUBIC:4x4 像素邻域的双三次插值
cv2.INTER_LANCZOS4:8x8 像素邻域的Lanczos插值
图像缩为原来1/4

源码如下:
import cv2
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
print(image1.shape) #
height, width = image1.shape[:2] # 获取图片的高度和宽度
image2=cv2.resize(image1,(int(0.5*width), int(0.5*height)))
print(image2.shape) #
cv2.imwrite(r"D:/cv2Demo/lotus2Quarter.png",image2)#保存
图像翻转函数cv2.flip(src, flipCode[, dst])
参数说明:
scr:变换操作的输入图像
flipCode:控制参数,整型(int),flipCode>0 水平翻转,flipCode=0 垂直翻转,flipCode<0 水平和垂直翻转
dst:变换操作的输出图像,可选项
图像翻转源码:
import cv2
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
imgFlip1 = cv2.flip(image1, 1) # 0垂直翻转 ;1水平翻转 ;-1水平和垂直翻转
cv2.imshow("image2",imgFlip1)
cv2.waitKey(0)
实现图像的直角倍数旋转函数cv2.rotate(src, rotateCode[, dst])
cv2.rotate()以90度的倍数旋转2D阵列(array),速度很快。
参数说明:
src:变换操作的输入图像
rotateCode:枚举,指定旋转角度。
cv2.ROTATE_90_CLOCKWISE:顺时针旋转 90 度
cv2.ROTATE_180: 旋转 180 度
cv2.ROTATE_90_COUNTERCLOCKWISE:逆时针旋转 90 度
dst:它是与src图像大小和深度相同的输出图像。它是一个可选参数。
图像顺时针旋转90度源码:
import cv2
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
image2 = cv2.rotate(image1,cv2.ROTATE_90_CLOCKWISE) #顺时针旋转90度
cv2.imshow("image2",image2)
cv2.waitKey(0)
下面介绍图像旋转任意角度,先介绍用到两个函数
获取旋转变换矩阵函数cv2.getRotationMatrix2D(center, angle, scale)
参数说明:
center:旋转中心坐标,二元元组 (x0, y0)
angle:旋转角度,单位为角度,逆时针为正数,顺时针为负数
scale: 缩放因子
利用变换矩阵对图像进行变换函数cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
其中:
src - 输入图像。
M - 变换矩阵。
dsize - 输出图像的大小。
flags - 插值方法的组合(int 类型!)
borderMode - 边界像素模式(int 类型!)
borderValue - (重点!)边界填充值; 默认情况下,它为0。
下面介绍图像旋转任意角度的三种实现方法
法一、图像旋转任意角度源码(有剪裁)

源码如下:
#图像旋转任意角度源码(有剪裁)
import cv2
#第一个参数穿opencv读取的图像,第二个参数传入需要旋转的角度
def rotate_bound(image, angle):
height, width = image.shape[:2] # 取前两个值(H,W)
# 第一个参数旋转中心,第二个参数旋转角度,第三个参数缩放比例
center = ( width//2,height//2) # 以图像中心为旋转中心
scale = 1 # 等比例旋转,即旋转后尺度不变
# 获得旋转矩阵
M = cv2.getRotationMatrix2D(center, -angle, scale)
# 进行仿射变换,其中
#“,borderValue=(255,255,255)”定义边界填充色彩白色,省略默认黑色,相当于borderValue=(0,0,0)
return cv2.warpAffine(image, M, (width, height),borderValue=(255,255,255))
image1 = cv2.imread(r"D:/cv2Demo/lotus2.png")
image2 = rotate_bound(image1, 45)
cv2.imshow('image', image2) #显示图片
cv2.waitKey(0)
法二、图像旋转任意角度源码(无剪裁)

源码如下:
#图像旋转任意角度源码(无剪裁)
import numpy as np
import cv2
#第一个参数穿opencv读取的图像,第二个参数传入需要旋转的角度
def rotate_bound(image, angle):
# 获取图像的尺寸,并确定中心
(h, w) = image.shape[:2]
(cX, cY) = (w // 2, h // 2)
# 获取旋转矩阵(应用角度的负数以顺时针旋转)
# 获取正弦和余弦(即矩阵的旋转分量)
M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
#计算图像的新边界尺寸
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin))
# 调整矩阵
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY
#进行仿射变换,其中
#“,borderValue=(255,255,255)”定义边界填充色彩白色,省略默认黑色,相当于borderValue=(0,0,0)
return cv2.warpAffine(image, M, (nW, nH),borderValue=(255,255,255))
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
image2 = rotate_bound(image1, 45)
cv2.imshow('image', image2) #显示图片
cv2.waitKey(0)
#cv2.imwrite(r"D:/cv2Demo/lotus2AsSave.png", image2) #保存
法三、图像旋转任意角度源码(无剪裁之二)

源码如下(请和法二对比):
#图像旋转任意角度源码(无剪裁之二)
import cv2
import numpy as np
def opencv_rotate(img, angle):
h, w = img.shape[:2] # 图像的(行数,列数,色彩通道数)
center = (w / 2, h / 2)
scale = 1.0
# 1 获取M矩阵
# cv2.getRotationMatrix2D(获得仿射变化矩阵)
M = cv2.getRotationMatrix2D(center, -angle, scale)
# 2 扩大画布,新的宽高,radians(angle) 把角度转为弧度 sin(弧度)
new_H = int(w * np.fabs(np.sin(np.radians(angle))) + h * np.fabs(np.cos(np.radians(angle))))
new_W = int(h * np.fabs(np.sin(np.radians(angle))) + w * np.fabs(np.cos(np.radians(angle))))
# 3 平移
M[0, 2] += (new_W - w) / 2
M[1, 2] += (new_H - h) / 2
# cv2.warpAffine(进行仿射变化)
rotate = cv2.warpAffine(img, M, (new_W, new_H), borderValue= (0, 0, 0))
return rotate
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
image2 = opencv_rotate(image1, 45)
cv2.imshow('image', image2) #显示图片
cv2.waitKey(0)
#cv2.imwrite(r"D:/cv2Demo/lotus2AsSave.png", image2) #保存
OK!
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem
是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案