OpenCV 4.0 — 入门
1. 图像基础
1. 1基本概念
(1)像素:计算机屏幕上所能显示的最小单位。用来表示图像的单位。
(2)RGB,R : Red,G : Green,B : Blue,范围0~255。
1. 2 坐标系
这个logo像素是:18 X 20 = 360 pixels
坐标系的原点(0,0)在左上角,每一个点的坐标是:
(height, width, channel)。往右边是x轴正方向,下边是y轴正方向
1.3 基本操作(彩色图片)
(1)读取图片:cv2.imread( ) 。
(2)获取图片的形状:img.shape,返回一个 (rows, heights, channels)。
(3)获取图片的大小:img.size,返回一个rows*heights*channels。
(4)显示图片:cv2.imshow( )。
(5)等待:cv2.waitKey(0)。
(6)关闭:cv2.destroyAllWindows()。
import cv2
# 读取图片
img = cv2.imread(filename="./rose.jpg")
# 显示图片
cv2.imshow(winname="image",mat=img)
# 读取图片的形状 (584, 1036, 3)
# shape:[高度,宽度,通道]
print(img.shape)
# 图片的数据类型
# uint8
print(img.dtype)
# 图片的大小 1815072 = 584*1036*3 = H*W*C
print(img.size)
# opencv中,图片是BGR三通道 三个通道分别是B,G,R
# 第一个通道是B,第二个通道G,第三个通道是R
# [H,W,C]对于[y,x,c]
(b,g,r) = img[5,40]
print(b,g,r)
print(img[5,40].shape)
print(img[5,].shape)
# b 蓝色
b = img[5,40,0]
print(b)
# g 绿色
g = img[5,40,1]
print(g)
# r 红色
r = img[5,40,2]
print(r)
# 像素点重新赋值
# img[5,40] = [0,0,0]
# # 显示图片
# cv2.imshow(winname="image",mat=img)
# cv2.waitKey(0)
img[5:157,5:57] = 0
print(img)
cv2.imshow(winname="image2",mat=img)
cv2.waitKey(0)
# 关闭所有窗口
cv2.destroyAllWindows()
1.4 基本操作(灰度图片)
(1)读取图片:cv2.imread( img, cv2.IMREAD_GRAYSCALE )
(2)获取图片的形状:img.shape,返回一个(rows, heights)
# 展示灰度图片
img = cv2.imread(filename="./rose.jpg",flags=cv2.IMREAD_GRAYSCALE)
cv2.imshow(winname="gray",mat=img)
# (584, 1036)
# print(img.shape)
value = img[5,40]
print("value = ",value)
# 3.BGR顺序
img_logo = cv2.imread(filename="./OpenCV.png")
print(img_logo.shape)
b,g,r = cv2.split(m = img_logo)
print("b.shape = ",b.shape)
print("g.shape = ",g.shape)
print("r.shape = ",r.shape)
cv2.imshow(winname="b",mat=b)
cv2.imshow(winname="g",mat=g)
cv2.imshow(winname="r",mat=r)
# 交换一下顺序
img_new = cv2.merge(mv=[r,g,b])
cv2.imshow(winname="rimg_new",mat=img_new)
import matplotlib.pyplot as plt
plt.subplot(121)
plt.imshow(X=img_logo)
plt.title("BGR")
plt.subplot(122)
plt.title("RGB")
plt.imshow(X=img_new)
plt.show()
读取灰度图像使用 img = cv2.imread(filename="./rose.jpg",flags=cv2.IMREAD_GRAYSCALE)方法
将B,G,R三通道分离开使用函数,b,g,r = cv2.split(m = img_logo)
合并通道使用函数 img_new = cv2.merge(mv=[r,g,b])
1.5 BGR 顺序
总结
在OpenCV中,彩色图片的又BGR三通道组成的,图片的形状shape是[H,W,C]即高度、宽度、通道数组成,由坐标系看就是[y,x,C],一个彩色图像就相当于一个有像素的立方体,最外层的0通道是表示B(蓝色)通道,1通道表示G(绿色通道),2表示R(红色通道),能想象出来。
2.argparse模块
2.1. 定义:
(1)argparse模块使编写用户友好的命令行接口变得容易。
(2)程序定义了它需要的参数,而argparse将找出如何从sys.argv中解析这些参数。
(3)argparse模块还会自动生成帮助和使用消息,并在用户给程序提供无效参数时发出错误信息。
2.2. 讲解
import argparse # 导入库
parser = argparse.ArgumentParser() # 获取所有参数
parser.add_argument(“-n1”, “--number one”, help=“第一个参数”, type=int) # 添加参数1
parser.add_argument(“-n2”, “--number two”, help=“第二个参数”, type=int) # 添加参数2
args = parser.parse_args() # 解析所有参数
import argparse
parser = argparse.ArgumentParser()
# 第一个参数
parser.add_argument("number1",help="第一个参数",type=int)
parser.add_argument("number2",help="第二个参数",type=int)
# 解析所有的参数
args = parser.parse_args()
print("第一个参数:",args.number1)
print("第二个参数:",args.number2)
# 结果
# 第一个参数: 3
# 第二个参数: 5
# 所有参数: Namespace(number1=3, number2=5)
2.3 参考资料
(1)官网教程1:
https://docs.python.org/3/howto/argparse.html
(2)官网教程2:https://docs.python.org/3/library/argparse.html#module-argparse
3.读取、显示图片
- 第一种方式:直接通过Anaconda读取、显示
- 第二种方式:通过argparse模块读取,显示
# 1.导入库
import cv2
import argparse
# 2.获取参数
parser = argparse.ArgumentParser()
# 3.添加参数
parser.add_argument("path_image",help="输入图片的路径")
# 4.解析参数
args = parser.parse_args()
# 5.1加载图片 方式一
img = cv2.imread(filename=args.path_image)
cv2.imshow(winname="parser_img",mat=img)
# 5.2 加载图片 方式二
# {"path_image":"./image/rose.jpg"}
args_dict = vars(parser.parse_args())
img2 = cv2.imread(args_dict["path_image"])
cv2.imshow(winname="dict_img",mat=img)
# 6.暂停
cv2.waitKey(0)
# 7.销毁所有窗口
cv2.destroyAllWindows()
小结
1. 读取
cv2.imread(img_path),img_path :图片路径
2. 显示
cv2.imshow(img),img : 图片
3. argparse模块中的vars()方法,将参数以字典形式保存
4. 读取、处理、保存图片
import cv2
import argparse
# 1.获取参数
parser = argparse.ArgumentParser()
# 2.添加输入的命令行参数
parser.add_argument("img_input",help="读取一张图片")
parser.add_argument("img_output",help="保存处理后的图片")
# 3.解析参数 以字典形式保存
args = vars(parser.parse_args())
# 4.加载图片
img = cv2.imread(filename=args["img_input"])
# 5.灰度处理
# 将原始图像转为灰度图像
img_gray = cv2.cvtColor(src=img,code=cv2.COLOR_BGR2GRAY)
# 6.保存图片
cv2.imwrite(filename=args["img_output"],img=img_gray)
# 7.显示图片
cv2.imshow(winname="img_gray",mat=img_gray)
# 8.暂停+销毁
cv2.waitKey(0)
cv2.destroyAllWindows()
主要用到的就是下面cvtColor()函数# 将原始图像转为灰度图像
img_gray = cv2.cvtColor(src=img,code=cv2.COLOR_BGR2GRAY)
小结
1. 灰度处理
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
2. 保存图片
cv2.imwrite(img_path, img_new)
img_path: 图片路径,img_new: 处理后的图片
5. 读取摄像头、视频文件
import cv2
import argparse
# 1.获取参数
parser = argparse.ArgumentParser()
# 2.添加获取输入
parser.add_argument("index_camers",help="摄像头的id",type=int)
# 3.解析参数
args = parser.parse_args()
print("摄像头 index = ",args.index_camers)
print(type(args))
# 4.捕获摄像头的视频
capture = cv2.VideoCapture(args.index_camers)
# 5.获取帧的宽度
# capture,property
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
# frame per seconds
fps = capture.get(cv2.CAP_PROP_FPS)
print("帧的宽度:",frame_width)
print("帧的高度:",frame_height)
print("fps:",fps)
# 6.摄像头是否打开
if capture.isOpened() is False:
print("摄像头没打卡...")
# 7.读取摄像头,直到关闭
while capture.isOpened():
# 8.获取一帧
ret,frame = capture.read()
# 9.把捕获的帧,变成灰度
gray_frame = cv2.cvtColor(src=frame,code=cv2.COLOR_BGR2GRAY)
# 10.显示每一帧(视频流)
cv2.imshow(winname="frame",mat=frame)
cv2.imshow(winname="gray_frame",mat=gray_frame)
# 11.退出,输入q
if cv2.waitKey(20) & 0xFF == ord("q"):
break
# 释放资源
capture.release()
# 关闭窗口
cv2.destroyAllWindows()
小结
1. cv2.VideoCapture() 从摄像头获取视频流
2. capture.get() 获取帧的属性
3. capture.isOpened() 判断摄像头是否打开
4. cv2.waitKey(20) & 0xFF == ord('q') 键盘输入q退出
5. cv2.waitKey(20) & 0xFF == ord('c') 键盘输入c截取帧
6. capture.release() 释放资源
6. 从视频文件读取
# 加载库
import cv2
import argparse
# 获取参数
parser = argparse.ArgumentParser()
parser.add_argument("video_path",help="输入视频路径")
args = parser.parse_args()
video_path = args.video_path
# 加载视频文件
capture = cv2.VideoCapture(video_path)
# 6.读取视频
ret,frame = capture.read()
# ret:是否读取到了帧,没有帧就代表结束了
# 一直读
while ret:
cv2.imshow(winname="video",mat=frame)
ret, frame = capture.read()
if cv2.waitKey(20) & 0xFF == ord("q"):
break
# 释放摄像头资源
capture.release()
# 关闭
cv2.destroyAllWindows()
总结
1.主要还是使用VideoCapture这个类
capture = cv2.VideoCapture(video_path)
2.循环读取视频帧,直到读不到帧为止,或者用户按下了q退出键
3.ret,frame = capture.read()有两个返回值,ret是布尔类型,是否还有帧读
7. 保存摄像头读取的视频
# 导入库
import cv2
import argparse
# 获取参数
parser = argparse.ArgumentParser()
parser.add_argument("video_output",help="输出视频的保存路径")
args = parser.parse_args()
video_output = args.video_output
# 创建摄像头对象
capture = cv2.VideoCapture(0)
# 是否打开了摄像头
if capture.isOpened():
print("摄像头坏了或者没打开,请仔细检测一下")
# 读取摄像头内容
ret,frame = capture.read()
# 获取帧的属性
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
# frame per second 每秒在你眼前,闪过多少张照片
fps = capture.get(cv2.CAP_PROP_FPS)
# 对视频进行编码
#VideoWriter_fourcc为视频编解码器
fourcc = cv2.VideoWriter_fourcc(*"XVID")
output_gray = cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), True)
# 读取摄像头
while capture.isOpened():
ret,frame = capture.read()
if ret:
# 转为灰度图
# gray_frame = cv2.cvtColor(src=frame,code=cv2.COLOR_BGR2GRAY)
gray_frame = frame
# 写入新的视频文件中
output_gray.write(gray_frame)
# 显示图片
cv2.imshow(winname="mp4",mat=gray_frame)
if cv2.waitKey(20) & 0xFF == ord("q"):
break
else:
break
capture.release()
output_gray.release()
cv2.destroyAllWindows()
小结
1. 视频编码:
fourcc = cv2.VideoWriter_fourcc(*'XVID')
2. 灰度写入视频文件
cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), False)