2021-9-29 学习笔记

本文详细介绍了OpenCV 4.0的基本概念,如像素、坐标系和颜色模式,展示了读取、显示图片、灰度处理、BGR顺序转换以及argparse模块在参数处理中的应用。涵盖了摄像头操作、视频读写、图像色彩转换和视频编码等内容。
摘要由CSDN通过智能技术生成

OpenCV 4.0 — 入门

1. 图像基础

1. 1基本概念

1)像素:计算机屏幕上所能显示的最小单位。用来表示图像的单位。

2RGBR : RedG : GreenB : Blue,范围0~255

1. 坐标系

这个logo像素是:18 X 20 = 360 pixels

坐标系的原点(0,0)在左上角,每一个点的坐标是:

(height, width, channel)。往右边是x轴正方向,下边是y轴正方向

 1.基本操作(彩色图片

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值