OpenCV笔记整理【一】

1. 简介:OpenCV的全称是 Open Source Computer Vision Library,是一个跨平台的开源计算机视觉库。由Gary Bradsky于1999年在英特尔发起并创立。这里使用的OpenCV版本为:4.5.2

查看当前的Python版本的OpenCV版本:

# 导入OpenCV模块
import cv2
# 打印版本信息
print(cv2.__version__)

2. 基本语法:

  1. 读取一张图片并显示:
# 导入模块
import cv2

# 读取图片
# cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。
# cv.IMREAD_GRAYSCALE:以灰度模式加载图像
# cv.IMREAD_UNCHANGED:加载图像,包括alpha通道
img=cv2.imread("./A.png",cv2.IMREAD_UNCHANGED)

# 显示图片
cv2.imshow("Open img",img)

# 等待用户按下按键
k==cv2.waitKey(0)

# 判断并打印
if k==ord('a'):
    print('a')
elif k==ord('b'):
    print('b')
    
# 销毁窗口
cv2.destroyAllWindows()
  1. 修改颜色通道的像素值: B\G\R 通道分别表示:0\1\2
img[100,100,1]=255	# 给100行,100列的绿色通道的像素值赋值为:255
print(img[100,100])	# 打印100行,100列的所有通道像素值
print(img[100,100,2])	# 打印100行,100列的红色通道像素值
  1. 获取图像分辨率、像素、位图类型
print(img.shape) # 获取xy方向的像素分布个数--分辨率
print(img.size) # 获取图像的像素值总数
print(img.dtype) # 位图类型:8位、24位
  1. 图像裁剪:
import cv2
import numpy as np

img=cv2.imread("contours.BMP",cv2.IMREAD_UNCHANGED)

b=np.ones((150,150,3)) #创建一个 150行150列3维 数组
b=img[100:200,150:300] # 裁剪原图 x(startx,endx) y(starty,endy)
cv2.imshow("Original",img) # 原图
cv2.imshow("CutImg",b) # 裁剪后的图
cv2.waitKey()
cv2.destroyAllWindows()

结果
在这里插入图片描述
5. 通道分离与合并:

import cv2
import numpy as np

a=cv2.imread("gril.png",cv2.IMREAD_UNCHANGED)

# 拆分通道:b,g,r
b,g,r=cv2.split(a)
cv2.imshow("b",b)
cv2.imshow("g",g)
cv2.imshow("r",r)

# 合并通道
m=cv2.merge([b,g,r])
cv2.imshow("merge",m)

cv2.waitKey()
cv2.destroyAllWindows()

运行
在这里插入图片描述
6. 图像加法运算:
区别:

a+b:(a+b)%256  如果大于255,则除以256,然后结果取余
cv2.add(a+b):如果(a+b)大于255,则等于255,如果小于255,等于原值
import cv2

a=cv2.imread("lena.bmp",0)

b=a
result1=a+b
result2=cv2.add(a,b)
# 显示
cv2.imshow("original",a)
cv2.imshow("result1",result1)
cv2.imshow("result2",result2)

cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
图像加权和:img1 x weighted1 + img2 x weighted2 + brightness
可以弱化或者加强两张图片的权重值,比如:将img1的人脸弱化,将img2的人脸加强,就可以实现换脸。

# (a=img1,1=weighted,b=img2,0.3=weighted,100=brightness)
result=cv2.addWeighted(a,1,b,0.3,100) 
import cv2

lena=cv2.imread("lena512.bmp",cv2.IMREAD_UNCHANGED)
dollar=cv2.imread("dollar.bmp",cv2.IMREAD_UNCHANGED)
cv2.imshow("lena",lena)
cv2.imshow("dollar",dollar)
face1=lena[220:400,250:350] # 截取小姐姐脸上x方向220-400,y方向250-350之间的像素
face2=dollar[160:340,200:300] # 截取美刀x方向160-340,y方向200-300之间的像素
add=cv2.addWeighted(face1,0.8,face2,0.3,0) # 分配权重,得到新图
dollar[160:340,200:300]=add # 替换
cv2.imshow("result",dollar)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
7. 按位逻辑运算(与运算:与255得原值,与0得0)

import cv2
import numpy  as np
# 创建一个5x5的8位数组,元素值在0-255之间随机
a=np.random.randint(0,255,(5,5),dtype=np.uint8)
# 创建一个5x5的8位数组
b=np.zeros((5,5),dtype=np.uint8)
# 全白
b[0:4,0:4]=255
# 按位与运算:加边框
c=cv2.bitwise_and(a,b)
print("a=\n",a)
print("b=\n",b)
print("c=\n",c)

运行:
在这里插入图片描述
8. 图像转换:

import cv2

a=cv2.imread("gril.png",cv2.IMREAD_UNCHANGED)
b=cv2.cvtColor(a,cv2.COLOR_BGR2GRAY) # color=>gray
cv2.imshow("RGB",a)
cv2.imshow("GRAY",b)

cv2.waitKey()
cv2.destroyAllWindows()
  1. 图像几何变换:
#  缩放
import cv2

img=cv2.imread("D:\OpenCV\OpenCV\gril.png")
rows,cols=img.shape[:2] # 取图像的行、列 [:3]表示取行、列、通道
size=(int(cols*0.5),int(rows*0.5)) # 行列缩小2倍
rst=cv2.resize(img,size) # 缩放
# rst=cv2.resize(img,None,fx=0.5,fy=0.5) 另一种写法
print("img.shape=",img.shape)
print("rst.shape=",rst.shape)

cv2.imshow("o",img)
cv2.imshow("res",rst)
cv2.waitKey()
cv2.destroyAllWindows()

运行
img.shape= (480, 370, 3)
rst.shape= (240, 185, 3)
在这里插入图片描述

# 翻转
import cv2

img=cv2.imread("lena.bmp")
x=cv2.flip(img,0) # 沿x轴翻转
y=cv2.flip(img,1) # 沿y轴翻转
xy=cv2.flip(img,-1) # 沿xy轴翻转
cv2.imshow("img",img)
cv2.imshow("x",x)
cv2.imshow("y",y)
cv2.imshow("xy",xy)
cv2.waitKey()
cv2.destroyAllWindows()

运行
在这里插入图片描述

# 平移
import cv2
import numpy as np

img=cv2.imread("lena.bmp")
height,width=img.shape[:2]
x=img.shape[0]/2 # x一半
y=img.shape[1]/2  # y一半

# 建立一个2x3的矩阵,结构如下:
# 	[[  1.   0.  x.]
# 	[  0.   1.  y.]]
M = np.float32([[1, 0, x], [0, 1, y]])

# 仿射变换:将原图的xy分别平移到图像中心
move=cv2.warpAffine(img,M,(width,height))

print(M) # 打印 M 矩阵
cv2.imshow("original",img)
cv2.imshow("move",move)
cv2.waitKey()
cv2.destroyAllWindows()

运行:
[[ 1. 0. 256.]
[ 0. 1. 256.]]
在这里插入图片描述

# 旋转
import cv2

img=cv2.imread("lena.bmp")
height,width=img.shape[:2]

# getRotationMatrix2D(旋转中心,旋转角度,缩放比例),返回一个矩阵
# 旋转角度:+为逆时针 -为顺时针
M=cv2.getRotationMatrix2D((width/2,height/2),-45,0.5)

# 仿射变换
rotate=cv2.warpAffine(img,M,(width,height))
print(M)
cv2.imshow("original",img)
cv2.imshow("rotation",rotate)
cv2.waitKey()
cv2.destroyAllWindows()

运行
[[ 0.35355339 -0.35355339 256. ]
[ 0.35355339 0.35355339 74.98066402]]
在这里插入图片描述

# 仿射变换
import cv2
import numpy as np

img=cv2.imread('lena.bmp')
rows,cols,ch=img.shape

# 创建p1矩阵,3个点分别是原图的左上角、右上角、左下角
#    [[  0.    0.]      左上点
#     [512.    0.]      右上点
#     [  0.  512.]]     左下点
p1=np.float32([[0,0],[rows,0],[0,cols]])

# 创建p2矩阵,3个点分别是:
#    [[  0.  256.]      左上点
#     [256.  256.]      右上点
#     [256.  512.]]     左下点
p2=np.float32([[0,cols*0.5],[rows*0.5,cols*0.5],[rows*0.5,cols*1]])

# 获取转换矩阵M
M=cv2.getAffineTransform(p1,p2)

# 通过转换矩阵M,完成从原始图像到目标图像的仿射变换
dst=cv2.warpAffine(img,M,(cols,rows))


cv2.imshow("origianl",img)
cv2.imshow("result",dst)
cv2.waitKey()
cv2.destroyAllWindows()

运行:
在这里插入图片描述

# 透视变换:将矩形映射为任意平行四边形
import cv2
import numpy as np

img=cv2.imread('demo.bmp')
rows,cols=img.shape[:2]

# 原始矩形的四个顶点坐标
pts1 = np.float32([[150,50],[400,50],[60,450],[310,450]])

# 目标矩形的四个顶点坐标
pts2 = np.float32([[50,50],[rows-50,50],[50,cols-50],[rows-50,cols-50]])

# 获取转换矩阵
M=cv2.getPerspectiveTransform(pts1,pts2)

# 透视转换
dst=cv2.warpPerspective(img,M,(cols,rows))

cv2.imshow("img",img)
cv2.imshow("dst",dst)
cv2.waitKey()
cv2.destroyAllWindows()

运行:
在这里插入图片描述
先写到这里,Over!!!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,OpenCV是一个开源计算机视觉和机器学习软件库,用于开发图像和视频处理应用程序。通过使用OpenCV,您可以读取摄像头并显示实时图像,打开视频文件或摄像头文件,并获取视频的相关信息,例如帧宽度、帧高度、帧率和总帧数。 对于学习OpenCV,你可以按照以下步骤进行: 1. 安装OpenCV库:在开始学习OpenCV之前,您需要从OpenCV官方网站下载和安装OpenCV库。根据您的操作系统和编程语言选择合适的版本。 2. 学习基本概念:熟悉OpenCV的基本概念和术语,例如图像和视频的加载、显示、保存以及常用的图像处理操作,如滤波、边缘检测和特征提取等。 3. 掌握OpenCV函数和类:深入了解OpenCV提供的函数和类,例如cv::Mat用于图像和矩阵操作,cv::VideoCapture用于读取和处理视频,以及cv::imshow和cv::waitKey等用于显示图像的函数。 4. 实践项目:通过完成一些实践项目来应用您所学到的知识。例如,利用OpenCV实现人脸检测、目标追踪、图像识别等。 5. 学习资料和资源:查找和阅读OpenCV的官方文档、教程和示例代码,参与开源社区讨论和交流,加入相关的论坛和邮件列表等。 总结起来,学习OpenCV包括安装OpenCV库、学习基本概念、掌握OpenCV函数和类、实践项目以及查找和阅读相关资料和资源。通过不断实践和学习,您将能够更好地理解和应用OpenCV库来开发图像和视频处理应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值