OpenCV学习日记(一)——图片和视频的基本操作

本文介绍了OpenCV在Python中进行图片和视频基本操作的方法,包括加载和保存图片、视频采集与录制,以及如何控制鼠标和使用TrackBar控件。通过实例详细讲解了每个功能的实现步骤,适合OpenCV初学者参考学习。
摘要由CSDN通过智能技术生成

本文记录一下近期对OpenCV的学习,可能也对跟我一样的初学者有所帮助,希望大家可以多多交流,共同进步

创建并显示窗口

import cv2

# cv2,WINDOW_AUTOSIZE 窗口大小自动,不可调节
# cv2.WINDOW_NORMAL 窗口大小为设定值,可调
# cv2.WINDOW_FREERATIO 自由比例调节
# cv2.WINDOW_KEEPRATIO 保持比例调节
cv2.namedWindow('new',cv2.WINDOW_NORMAL)

# 修改窗口大小
cv2.resizeWindow('new', 640, 480)
#展示图片
cv2.imshow('new',0)

#waiKey方法表示等待按键,超过时间没有发生按键操作窗口会自动关闭,0表示任何按键,其它整数表示等待按键的时间,单位ms
#返回按键的ASCII值
key = cv2.waitKey(0)

#销毁所有窗口
if key & 0xff == ord('q'):
    cv2.destroyAllWindows()

加载图片

  • imread(path,flag) 使用imread可以读取图片,默认彩色图片
#导包
import cv2
import numpy as np

#读取图片
img = cv2.imread("./001.png")

#显示图片
#因为OpenCV读取的图片颜色通道是按照BGR读取,而一般图像是按RGB排列
#为正常显示,要调用OpenCV的显示方法
cv2.imshow('1',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

保存图片

  • imwrite(path,img): 用来保存图片
import cv2

cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',640,480)

img = cv2.imread("./001.png")

#利用while循环优化退出逻辑
while True:
    cv2.imshow('img',img)
    key = cv2.waitKey(0)
    if(key & 0xff == ord('q')):
        break
    elif(key & 0xff == ord('s')):
        cv2.imwrite("./123.png",img)
    else:
        print(key)

cv2.destroyAllWindows()

视频采集

  • 视频的每一帧都是一幅图片,如果是30帧,则表示1s显示30张图片
  • cv2.VideoCapture可以捕获摄像头,也可以打开视频文件
  • 如果是视频文件,直接指定路径即可
#打开视频文件
vc = cv2.VideoCapture('./1.mp4')

#打开摄像头
vc = cv2.VideoCapture(0)
#检查是否正确打开
if vc.isOpened():
    #读取视频的一帧
    open,frame = vc.read()
else:
    open = False

#循环读取视频每一帧数据
while True# 可以正确读到数据,则ret返回True
    ret,frame = vc.read()
    # 读到最后,frame为空
    if frame is None:
        break
    if ret == True:
        cv2.imshow('result',gray)
        # 0xff == 27 表示按 ESC 会退出
        if cv2.waitKey(33) & 0xFF == 27:
            break
vc.release()
cv2.destroyAllWindows()
  • cap.read()返回两个值,第一个为状态值,读到帧为True,第二个值为视频帧
  • cap.release() 释放摄像头资源
# 循环读取摄像头每一帧数据

# 创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',1280,800)

# 获取视频设备
cap=cv2.VideoCapture(0)

while True:
    # 从摄像头读取视频
    ret,frame=cap.read()
    
    # 将视频帧放在窗口中显示
    cv2.imshow('video',frame)
    
    # 等待键盘事件,如果为q,则退出
    key=cv2.waitKey(1)
    if key & 0xff == ord('q'):
        break

# 释放
cap.release()
cv2.destroyAllWindows()

视频录制

  • VideoWriter:
    • 第一个参数为输出文件,
    • 第二个参数为多媒体文件格式(VideoWriter_fourcc)
    • 第三个参数为帧率,第四个参数为分辨率
  • write 编码并写入缓存
  • release 缓存内容写入磁盘,并释放资源
cap = cv2.VideoCapture(0)
# *mp4v就是解包操作,相当于'm', 'p', '4', 'v'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')

# (640, 480)表示摄像头拍视频的分辨率,大小不能写错
# 如果写错生成的视频文件可能打不开
vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print('cannot recive frame, Exiting...')
        break
        
    vw.write(frame)
    cv2.imshow('frame', frame)
    
    if cv2.waitKey(1) == ord('q'):
        break
        
cap.release()

#释放VideoWriter
vw.release()

cv2.destroyAllWindows()

控制鼠标

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

  • setMouseCallback(winname,callback,userdata)

    • winname 是窗口的名字
    • callback 是回调函数
    • userdata 是回调函数的参数
  • callback(event,x,y,flags,userdata) 用户的回调函数必须包含5个参数

    • event 发生的事件,例如鼠标移动,左键按下,左键释放
    • x,y 鼠标的坐标点
    • flags 主要用于组合键
    • userdata 上面setMouseCallback函数中的userdata

鼠标事件:

  • EVENT_MOUSEMOVE 0 鼠标移动
  • EVENT_LBUTTONDOWN 1 按下鼠标左键
  • EVENT_RBUTTONDOWN 2 按下鼠标右键
  • EVENT_MBUTTONDOWN 3 按下鼠标中键
  • EVENT_LBUTTONUP 4 左键释放
  • EVENT_RBUTTONUP 5 右键释放
  • EVENT_MBUTTONUP 6 中键释放
  • EVENT_LBUTTONDBLCLK 7 左键双击
  • EVENT_RBUTTONDBLCLK 8 右键双击
  • EVENT_MBUTTONDBLCLK 9 中键双击
  • EVENT_MOUSEWHEEL 10 鼠标滚轮上下滚动
  • EVENT_MOUSEHWHEEL 11 鼠标左右滚动

flags:

  • EVENT_FLAG_LBUTTON 1 按下左键
  • EVENT_FLAG_RBUTTON 2 按下右键
  • EVENT_FLAG_MBUTTON 4 按下中键
  • EVENT_FLAG_CRTLKEY 8 按下ctrl键
  • EVENT_FLAG_SHIFTKEY 16 按下shift键
  • EVENT_FLAG_ALTKEY 32 按下alt键
import cv2
import numpy as np


a=0
b=0

def mouse_callback(event,x,y,flags,userdata):
    # 多余的操作当作练手了
    # 本身不操作鼠标就不会触发回调函数
    global a,b
    if(x!=a | y!=b):
        a=x
        b=y
        print(event,x,y,flags,userdata)

    
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse',640,480)

# 设置鼠标回调函数
cv2.setMouseCallback('mouse',mouse_callback,'qw12')

# 显示窗口和背景并生成全黑的图片
# 分辨率反过来,数据类型用 np.uint8
img = np.zeros((480,640,3),np.uint8)

while True:
    cv2.imshow('mouse',img)
    key = cv2.waitKey(1)
    if key & 0xff == ord('q'):
        break
        
cv2.destroyAllWindows()

TrackBar 控件

  • createTrackbar(trackbarname,winname,value,count,onChange) 创建TrackBar控件
    • value为trackbar的起始值
    • count为bar的最大值,最小为0
  • getTrackbarPos(trackbarname,winname) 获取TrackBar当前值
# trackbar实现RGB色板
import cv2
import numpy as np

# 创建窗口
cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar',640,480)

# 定义回调函数
def callback(value):
    print(value)
    
# 创建trackbar
cv2.createTrackbar('R','trackbar',0,255,callback)
cv2.createTrackbar('G','trackbar',0,255,callback)
cv2.createTrackbar('B','trackbar',0,255,callback)

# 创建一个背景图片
img = np.zeros((480,640,3),np.uint8)

while True:
    # 获取当前trackbar的值
    r = cv2.getTrackbarPos('R','trackbar')
    g = cv2.getTrackbarPos('G','trackbar')
    b = cv2.getTrackbarPos('B','trackbar')
    
    # 改变图像颜色
    img[:] = [b,g,r]
    cv2.imshow('trackbar',img)
    
    key = cv2.waitKey(1)
    if key & 0xff == ord('q'):
        break

cv2.destroyAllWindows()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值