2024-12-03OpenCV图片处理基础

OpenCV图片处理基础

OpenCV的视频教学:https://www.bilibili.com/video/BV14P411D7MH


1-OpenCV摄像头读取

OpenCV使用摄像头读取图片帧,点击S保存当前帧到指定文件夹,点击Q关闭窗口,点击其他按钮打印按钮的值

要实现这个功能,你需要使用OpenCV的VideoCapture类来捕获摄像头的视频流,并使用cv2.waitKey()来检测按键事件。以下是一个简单的Python脚本,演示了如何使用OpenCV从摄像头读取图片帧,并根据用户的按键操作来保存当前帧或关闭窗口:

python 复制代码
import cv2
import os

# 指定保存图片的文件夹
save_folder = "saved_frames"
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

# 打开摄像头,0表示默认的摄像头
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("无法打开摄像头")
    exit()

frame_count = 0
while True:
    # 读取一帧图像
    ret, frame = cap.read()
    if not ret:
        print("无法读取视频帧")
        break

    # 显示图像
    cv2.imshow('Camera Feed', frame)

    # 等待按键事件,1表示等待1ms,0表示无限等待
    key = cv2.waitKey(1)

    # 's'键保存当前帧
    if key == ord('s') or key == ord('S'):
        frame_name = os.path.join(save_folder, f"frame_{frame_count}.jpg")
        cv2.imwrite(frame_name, frame)
        print(f"Frame saved as {frame_name}")
        frame_count += 1
    # 'q'键退出循环
    elif key == ord('q') or key == ord('Q'):
        break
    # 其他键打印值
    elif key != -1:
        print(f"Key pressed: {chr(key)}")

# 释放摄像头并关闭所有OpenCV窗口
cap.release()
cv2.destroyAllWindows()

这段代码首先检查摄像头是否可以打开,然后进入一个无限循环,在循环中不断地从摄像头读取图像帧并显示。cv2.waitKey(1)函数用于检测用户是否按下了键盘上的某个键。如果用户按下'S'或's',则当前帧会被保存到指定的文件夹中;如果用户按下'Q'或'q',则退出循环;如果用户按下其他键,程序会打印出该键的字符值。最后,释放摄像头资源并关闭所有OpenCV窗口。


2-OpenCV本地文件读取

OpenCV使用本地文件读取图片帧,点击S保存当前帧到指定文件夹,点击Q关闭窗口,点击其他按钮打印按钮的值

如果你想要从本地视频文件读取帧,而不是实时从摄像头捕获,你可以稍微修改之前的代码,使用cv2.VideoCapture来打开视频文件。以下是一个示例代码,它读取本地视频文件,并允许用户通过按键操作来保存当前帧或关闭窗口:

python 复制代码
import cv2
import os

# 指定保存图片的文件夹
save_folder = "saved_frames"
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

# 替换为你的视频文件路径
video_file_path = 'path_to_your_video_file.mp4'

# 打开视频文件
cap = cv2.VideoCapture(video_file_path)

if not cap.isOpened():
    print("无法打开视频文件")
    exit()

frame_count = 0
while True:
    # 读取一帧图像
    ret, frame = cap.read()
    if not ret:
        print("视频播放完毕")
        break

    # 显示图像
    cv2.imshow('Video Feed', frame)

    # 等待按键事件,0表示无限等待直到有按键被按下
    key = cv2.waitKey(0)

    # 's'键保存当前帧
    if key == ord('s') or key == ord('S'):
        frame_name = os.path.join(save_folder, f"frame_{frame_count}.jpg")
        cv2.imwrite(frame_name, frame)
        print(f"Frame saved as {frame_name}")
        frame_count += 1
    # 'q'键退出循环
    elif key == ord('q') or key == ord('Q'):
        break
    # 其他键打印值
    elif key != -1:
        print(f"Key pressed: {chr(key)}")

# 释放视频文件并关闭所有OpenCV窗口
cap.release()
cv2.destroyAllWindows()

这段代码首先尝试打开指定的视频文件。如果成功,它将进入一个循环,在循环中逐帧读取视频内容并显示。和之前摄像头捕获的例子类似,它使用cv2.waitKey(0)来等待用户按键事件。如果用户按下'S'或's',当前帧将被保存到指定的文件夹中;如果用户按下'Q'或'q',程序将退出循环;如果用户按下其他任意键,程序将打印出该键的字符值。最后,它释放视频文件资源并关闭所有OpenCV窗口。

请确保将video_file_path变量替换为你自己的视频文件路径。


3-OpenCV录制视频

OpenCV使用摄像头读取图片帧,录制到本地文件夹中,点击Q关闭窗口

要实现从摄像头读取视频帧并录制到本地文件的功能,你需要使用OpenCV的视频写入类VideoWriter。以下是一个示例代码,展示了如何从摄像头捕获视频帧并将其保存为一个视频文件,同时按'Q'键退出录制。

首先,请确保你已经安装了OpenCV库。如果没有安装,可以使用pip来安装:

pip install opencv-python

实现思路

  1. 打开摄像头以捕获视频流。
  2. 设置视频写入对象以保存录制的视频。
  3. 实时显示视频流,并检查用户输入。
  4. 如果用户按下'Q'键,则停止录制并退出程序。

解决方案代码

python 复制代码
import cv2

# 打开摄像头
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("无法打开摄像头")
    exit()

# 获取视频的基本信息
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))

# 定义视频编码器和输出文件
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))

try:
    while cap.isOpened():
        # 读取一帧
        ret, frame = cap.read()
        if not ret:
            print("无法读取视频帧")
            break

        # 写入帧到视频文件
        out.write(frame)

        # 显示帧-自定义需要  cv2.resizeWindow('Recording', 640,360)
        cv2.imshow('Recording', frame)

        # 检查是否按下'Q'键
        if cv2.waitKey(1) & 0xFF == ord('q'):
            print("录制结束")
            break
except Exception as e:
    print(f"发生错误: {e}")
finally:
    # 释放资源
    cap.release()
    out.release()
    cv2.destroyAllWindows()

代码解释

  1. 打开摄像头 :使用cv2.VideoCapture(0)打开默认摄像头。
  2. 获取视频属性:获取帧的宽度、高度和FPS,这些信息用于设置输出视频的属性。
  3. 创建视频写入对象 :使用cv2.VideoWriter创建一个对象来写入视频文件,指定编码器、文件名、FPS和帧大小。
  4. 读取和写入帧:在循环中,读取每一帧并写入视频文件,同时显示在窗口中。
  5. 检查按键 :使用cv2.waitKey(1)检查是否有按键按下,如果按下'Q'键,则退出循环。
  6. 释放资源:确保释放摄像头和视频写入对象,并关闭所有OpenCV窗口。

4-OpenCV控制鼠标

OpenCV控制鼠标打印鼠标的移动轨迹

使用Python和OpenCV库来创建一个窗口并设置鼠标回调函数,可以按照以下步骤进行操作:

  1. 导入必要的库。
  2. 定义一个鼠标回调函数,它将接收鼠标事件、x和y坐标以及用户定义的数据。
  3. 创建一个窗口。
  4. 设置鼠标回调函数到这个窗口。
  5. 显示一个图像(或者保持窗口打开但不显示任何图像)。
  6. 等待用户按键来关闭程序。

下面是具体的实现代码:

python 复制代码
import cv2
import numpy as np

# 鼠标回调函数
def mouse_callback(event, x, y, flags, param):
    # event: 鼠标的动作类型
    # x, y: 鼠标指针的位置坐标
    # flags: 按下的特殊键位信息
    # param: 用户传递的数据
    
    # 打印鼠标事件
    print(f"Event: {event}, X: {x}, Y: {y}")
    
    # 打印鼠标点击时的按钮信息
    if event == cv2.EVENT_LBUTTONDOWN:
        print("Left button of the mouse is clicked")
    elif event == cv2.EVENT_RBUTTONDOWN:
        print("Right button of the mouse is clicked")
    elif event == cv2.EVENT_MBUTTONDOWN:
        print("Middle button of the mouse is clicked")
    elif event == cv2.EVENT_MOUSEMOVE:
        print("Mouse is moving")


# 创建一个窗口(类比创建一个按钮绑定一个点击事件)
cv2.namedWindow('image')
# 将回调函数设置到窗口上
cv2.setMouseCallback('image', mouse_callback)

# 创建一个黑色图像
img = np.zeros((512, 512, 3), np.uint8)

# 显示图像
while True:
    cv2.imshow('image', img)
    if cv2.waitKey(20) & 0xFF == 27:  # 按ESC退出
        break

# 关闭所有窗口
cv2.destroyAllWindows()

在这段代码中:

  • mouse_callback 函数被定义用来处理鼠标事件。它会根据传入的 event 参数来判断发生了哪种类型的鼠标事件,并打印相应的消息。
  • 使用 cv2.namedWindow 创建了一个名为 'image' 的窗口。
  • 使用 cv2.setMouseCallback 方法将 mouse_callback 函数绑定到 'image' 窗口,这样每当在这个窗口内发生鼠标事件时,mouse_callback 函数就会被调用。
  • cv2.imshow 用于显示图像。这里我们创建了一个全黑的图像。
  • cv2.waitKey(20) 是用来等待用户按键的,这里设置为20毫秒,是为了让程序有足够的时间响应鼠标事件。如果按下了ESC键(ASCII码值为27),则跳出循环。
  • 最后,使用 cv2.destroyAllWindows 关闭所有由OpenCV创建的窗口。

运行这段代码后,当你在窗口中移动鼠标或点击鼠标时,控制台会输出相应的鼠标事件和位置信息。


4-OpenCV使用TrackBar

OpenCV创建3个TrackBar分别对应R/G/B,拖动TrackBar改变展示图片的颜色

要使用OpenCV创建三个Trackbar来分别控制图片的红(R)、绿(G)、蓝(B)三个颜色通道,你可以按照以下步骤编写代码:

  1. 导入必要的库。
  2. 加载一张图片。
  3. 创建一个窗口用于显示图片。
  4. 创建三个Trackbar,分别对应R、G、B通道。
  5. 定义一个回调函数,用于更新图片的颜色通道值。
  6. 在主循环中显示更新后的图片。

下面是一个完整的示例代码:

python 复制代码
import cv2
import numpy as np

# 加载图片
img = cv2.imread('path_to_your_image.jpg')  # 替换为你的图片路径

# 创建一个窗口用于显示图片
cv2.namedWindow('image')

# 创建三个Trackbar,分别对应R、G、B通道
cv2.createTrackbar('R', 'image', 0, 255, lambda x: None)
cv2.createTrackbar('G', 'image', 0, 255, lambda x: None)
cv2.createTrackbar('B', 'image', 0, 255, lambda x: None)

# 初始化颜色通道值
r = 0
g = 0
b = 0

# 定义一个回调函数,用于更新图片的颜色通道值
def update_color(x):
    global r, g, b
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    new_img = np.zeros_like(img)
    new_img[:, :, 0] = r  # 更新R通道
    new_img[:, :, 1] = g  # 更新G通道
    new_img[:, :, 2] = b  # 更新B通道
    cv2.imshow('image', new_img)

# 初始调用一次回调函数以显示初始颜色
update_color(0)

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

# 释放所有资源
cv2.destroyAllWindows()

在这段代码中,我们首先加载了一张图片,并创建了一个窗口来显示它。然后,我们为R、G、B三个通道各创建了一个Trackbar,范围从0到255。我们定义了一个update_color函数,它会被Trackbar的回调自动调用,以更新图片的颜色通道值。在主循环中,我们检查是否有按键事件,如果用户按下了'q'键,则退出循环。

请确保将'path_to_your_image.jpg'替换为你的图片文件的实际路径。如果你没有图片文件,可以使用OpenCV自带的示例图片或者一张你本地的图片。


相关推荐
AI浩几秒前
激活函数在神经网络中的作用,以及Tramformer中的激活函数
人工智能·深度学习·神经网络
杨善锦5 分钟前
mobile one神经网络
人工智能·深度学习·神经网络
Thanks_ks22 分钟前
深入探索现代 IT 技术:从云计算到人工智能的全面解析
大数据·人工智能·物联网·云计算·区块链·数字化转型·it 技术
东方佑1 小时前
给图像去除水印攻
人工智能·python
知来者逆1 小时前
Layer-Condensed KV——利用跨层注意(CLA)减少 KV 缓存中的内存保持 Transformer 1B 和 3B 参数模型的准确性
人工智能·深度学习·机器学习·transformer
tangjunjun-owen1 小时前
异常安全重启运行机制:健壮的Ai模型训练自动化
人工智能·python·安全·异常重运行或重启
爱研究的小牛2 小时前
Rerender A Video 技术浅析(二):视频增强
人工智能·深度学习·aigc
Bdawn2 小时前
【通义实验室】开源【文本生成图片】大模型
人工智能·python·llm
黑马王子132 小时前
谷歌史上最强大模型-Gemini2.0震撼发布!以后世界都属于智能体?
人工智能·google
电报号dapp1192 小时前
当前热门 DApp 模式解析:六大方向的趋势与创新
人工智能·去中心化·区块链·智能合约