opencv-基本使用

1. 基本操作

1.1 创建和显示窗口

1.1.1 namedWindow()创建命名窗口

cv2.WINDOW_NORMAL:允许用户调整窗口的大小;如果未设置,窗口大小会被图像尺寸自动限制,用户无法改变大小。

import cv2
cv2.namedWindow('new', cv2.WINDOW_NORMAL)
cv2.resizeWindow('new',800,600)
key = cv2.waitKey(0)
if key == ord('q'):
    exit()
cv2.destroyAllWindows()

cv2.WINDOW_AUTOSIZE:窗口大小会自动适应显示的图像尺寸,用户无法调整窗口大小;适用于固定大小图像展示。 

import cv2
cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE)
key = cv2.waitKey(0)
if key == ord('q'):
    exit()
cv2.destroyAllWindows()

cv2.WINDOW_FREERATIO:窗口大小会自动调整,但不会被图像的宽高比限制,窗口的比例可以自由调整。 

import cv2
cv2.namedWindow('new', cv2.WINDOW_FREERATIO)
key = cv2.waitKey(0)
if key == ord('q'):
    exit()
cv2.destroyAllWindows()

cv2.WINDOW_KEEPRATIO:窗口的宽高比保持一致,窗口大小会根据显示的图像大小进行调整,但宽高比不变。 

import cv2
cv2.namedWindow('new', cv2.WINDOW_KEEPRATIO)
key = cv2.waitKey(0)
if key == ord('q'):
    exit()
cv2.destroyAllWindows()

cv2.WINDOW_GUI_EXPANDED:窗口包含额外的控件,如工具栏等(适用于某些操作系统的特定平台)。 

import cv2
cv2.namedWindow('new', cv2.WINDOW_GUI_EXPANDED)
key = cv2.waitKey(0)
if key == ord('q'):
    exit()
cv2.destroyAllWindows()

cv2.WINDOW_GUI_NORMAL:窗口为普通的标准窗口,没有额外控件。

import cv2
cv2.namedWindow('new', cv2.WINDOW_GUI_NORMAL)
key = cv2.waitKey(0)
if key == ord('q'):
    exit()
cv2.destroyAllWindows()

1.1.2 imshow() 显示图片与窗口

大家有没有发现一个问题,由opencv读取的图片,使用其他方法展示()例如matplotlib展示时,就会出现颜色不对的情况,附上代码

import cv2
import matplotlib
matplotlib.use('TkAgg')  # 设置为交互式后端
# matplotlib.use('Agg')  # 或者使用 'Agg' 后端
import matplotlib.pyplot as plt
import numpy as np

# 读取图片(默认彩色途径)
img = cv2.imread("./car.jpg")
"""
发现matplotlib显示的图片和真实的图片颜色不一样,因为opencv读进来的图片数据的通道不是默认的RGB而是BGR,
所以opencv读进来的图片不要用别的方式去展示
"""
plt.imshow(img)
plt.show()

注:左图为opencv读取的原图,右图是matplotlib展示的图片

因为opencv读进来的图片数据的通道不是默认的RGB而是BGR,所以opencv读进来的图片不要用别的方式去展示。

如果我要调整展示窗口的大小的时候使用cv2.resizeWindow('new',800,600),那么对应的要修改imshow()展示的图片大小,应该怎么做呢?

import cv2
# 读取图片(默认彩色途径)
img = cv2.imread("./car.jpg")
img = cv2.resize(img, (880, 640), interpolation=cv2.INTER_CUBIC)
cv2.imshow("car",img)
key = cv2.waitKey(0)
if key == ord('q'):
    cv2.destroyAllWindows()

 cv2.resize() 是 OpenCV 用于调整图像大小的函数,其基本语法如下:

resized_image = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

参数说明

  • src(必填)输入的图像(numpy 数组)。

  • dsize(必填):目标大小 (width, height),即调整后的图像尺寸。可以设置为 None,如果 fxfy 已指定,则根据缩放比例调整大小。

  • dst(可选):输出的目标图像,通常不需要指定,因为 cv2.resize() 会返回调整后的图像。

  • fx(可选):水平方向缩放比例。例如 fx=0.5 表示宽度缩小 50%。

  • fy(可选):垂直方向缩放比例。例如 fy=0.5 表示高度缩小 50%。

  • interpolation(可选):插值方式,默认是 cv2.INTER_LINEAR。不同插值方法适用于不同的缩放需求:

    1. cv2.INTER_NEAREST:最近邻插值,计算速度快,可能会有马赛克效果。

    2. cv2.INTER_LINEAR(默认):双线性插值,适用于缩小图像时。

    3. cv2.INTER_CUBIC:双三次插值,计算较慢但效果比 INTER_LINEAR 更平滑。

    4. cv2.INTER_LANCZOS4:Lanczos 插值,适用于高质量缩小图像。

1.2 保存图片

import cv2

img = cv2.imread("car.jpg")
img = cv2.resize(img, (880, 640), interpolation=cv2.INTER_CUBIC)
cv2.imshow("car", img)
cv2.imwrite("car_1.png", img)
key = cv2.waitKey(0)
if key == ord('q'):
    cv2.destroyAllWindows()

1.3 读取摄像头和视频数据

打开摄像头,并且以窗口形式展示出来

# 打开摄像头
import cv2

# 打开摄像头 (0 代表默认摄像头,如果有多个摄像头,可以尝试 1, 2, 3...)
cap = cv2.VideoCapture(0)

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("无法打开摄像头")
    exit()

# 循环读取视频流
while True:
    # 读取一帧
    ret, frame = cap.read()

    # 如果读取失败,退出循环
    if not ret:
        print("无法获取视频帧")
        break

    # 在窗口中显示当前帧
    cv2.imshow('Camera', frame)

    # 按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源并关闭窗口
cap.release()
cv2.destroyAllWindows()

读取视频,并且以窗口形式展示

import cv2

cap = cv2.VideoCapture("../1.mp4")
print(cap.isOpened())
while cap.isOpened():
    # 读取一帧
    ret,frame = cap.read()
    # 如果读取失败,则推出
    if not ret:
        print("无法获取视频帧")
        break
    cv2.imshow("vedio", frame)
    if cv2.waitKey(1) & 0xFF ==ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

1.4 视频录制

# 视频录制
import cv2

cap = cv2.VideoCapture(0)
# *mp4v就是解包操作,等同于'm','p','4','v'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter("output.mp4",fourcc,20,(640,480))
while cap.isOpened():
    ret,frame = cap.read()
    if not ret:
        break
    out.write(frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

1.4.1 VideoWriter_fourcc的用法

  • 'mp4v': MPEG-4 编码格式,通常用于 .mp4 文件。
  • 'MJPG': Motion JPEG 编码格式,常用于较老的设备或一些不需要复杂压缩的场合。
  • 'XVID': Xvid 编码,广泛用于 .avi 格式。
  • 'DIVX': DivX 编码,通常用于 .avi 文件。
  • 'H264': H.264 编码(通过 cv2.VideoWriter_fourcc(*'H264') )。适用于压缩效率较高的视频文件。

1.4.2 VideoWriter的用法

cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=True)

 参数说明:

  • filename (str):
    视频文件的输出路径和文件名。
    例如:"output.mp4" 表示输出文件名为 output.mp4,也可以是其他格式,如 .avi.mov,根据你选择的编码格式来确定。

  • fourcc (int):
    视频编码格式的四字符代码(FourCC),用于指定视频编码类型。
    例如:cv2.VideoWriter_fourcc(*'mp4v'),其中 *'mp4v' 表示 MPEG-4 编码格式。其他常见的编码格式还有 'XVID''MJPG''H264' 等。

  • fps (float):
    每秒帧数(frames per second),即视频的帧率。
    例如:20 表示每秒钟写入 20 帧。你可以根据实际需求调整此值,通常视频帧率在 24 到 30 帧之间。

  • frameSize (tuple):
    视频帧的尺寸,通常是一个元组 (宽度, 高度)
    例如:(640, 480) 表示每帧的分辨率为 640x480 像素。视频帧的尺寸应与输入图像的尺寸相匹配。

  • isColor (bool, optional):
    一个布尔值,指定是否保存彩色视频。默认为 True,表示视频是彩色的。如果设为 False,则视频会被保存为灰度图像。
    通常不需要修改,保持 True 即可,除非你特别需要保存灰度视频。

2. 控制鼠标 

        OpenCv允许我们对窗口上的鼠标动作做出响应。

        在 OpenCV 中,使用 cv2.setMouseCallback() 函数可以注册一个鼠标回调函数,该函数会在鼠标事件发生时被调用。回调函数的签名为:

callback(event, x, y, flags, userdata)

 2.1 鼠标事件

  • cv2.EVENT_LBUTTONDOWN (左键按下) - 0

  • cv2.EVENT_LBUTTONUP (左键抬起) - 1

  • cv2.EVENT_RBUTTONDOWN (右键按下) - 2

  • cv2.EVENT_RBUTTONUP (右键抬起) - 3

  • cv2.EVENT_MBUTTONDOWN (中键按下) - 4

  • cv2.EVENT_MBUTTONUP (中键抬起) - 5

  • cv2.EVENT_MOUSEMOVE (鼠标移动) - 16

  • cv2.EVENT_LBUTTONDBLCLK (左键双击) - 7

  • cv2.EVENT_RBUTTONDBLCLK (右键双击) - 8

  • cv2.EVENT_MBUTTONDBLCLK (中键双击) - 9

  • cv2.EVENT_MOUSEWHEEL (鼠标滚轮) - 1024

  • cv2.EVENT_MOUSEHWHEEL (鼠标水平滚轮) - 2048

2.2 实例

def mouse_callback(event, x, y, flags, userdata):
    print(event, x, y, flags, userdata)
# 创建窗口
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
# 宽度和高度
cv2.resizeWindow('mouse', 640, 360)
# 设置鼠标的回调函数
cv2.setMouseCallback('mouse', mouse_callback,"123")
# 生成全黑的图片
img = np.zeros((360, 640, 3), np.uint8)
while True:
    cv2.imshow('mouse', img)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cv2.destroyAllWindows()

3. TrackBar控件

        在 OpenCV 中,cv2.createTrackbar() 可以用来创建一个滑动条(Trackbar),通过拖动 TrackBar 控件,用户可以动态调整图像的参数。我们可以使用这个控件来改变图像的颜色,例如通过调整 RGB(红、绿、蓝)通道的值来改变图像的颜色。

import cv2
import numpy as np

# 初始颜色值(R, G, B)
r, g, b = 0, 0, 0


# 回调函数,当 TrackBar 值变化时触发
def on_trackbar(val):
    global r, g, b
    r = cv2.getTrackbarPos("Red", "TrackBar Image")
    g = cv2.getTrackbarPos("Green", "TrackBar Image")
    b = cv2.getTrackbarPos("Blue", "TrackBar Image")

    # 创建新的图像,填充为当前颜色值
    img[:] = [b, g, r]  # OpenCV 默认是 BGR 顺序
    cv2.imshow("TrackBar Image", img)


# 创建一个空白图像
img = np.ones((400, 400, 3), dtype=np.uint8) * 255

# 创建一个窗口
cv2.namedWindow("TrackBar Image")

# 创建三个 TrackBar 控件,分别控制 R、G、B 颜色通道
cv2.createTrackbar("Red", "TrackBar Image", 0, 255, on_trackbar)
cv2.createTrackbar("Green", "TrackBar Image", 0, 255, on_trackbar)
cv2.createTrackbar("Blue", "TrackBar Image", 0, 255, on_trackbar)

# 显示初始图像
on_trackbar(0)

# 持续显示窗口,直到按下 'Esc' 键
while True:
    if cv2.waitKey(1) & 0xFF == 27:  # 按 'Esc' 键退出
        break

cv2.destroyAllWindows()

第一部分基本操作结束,后面继续学习颜色空间 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值