opencv基础学习--1.图像&视频的加载与展示

1.opencv基础学习–图像&视频的加载与展示

一.创建与使用窗口

  1. namedWindow()–创建窗口并起名
  2. imshow()–显示窗口(第一个参数为窗口名,若没有会自动创建)
  3. destoryAllWindows()–销毁所有窗口
  4. resizeWindows()–设置窗口大小,不设置默认为图片大小,也可自设定。
import cv2

#WINDOW_NORMAL可改变窗口大小
cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE)
#设置窗口打开的大小
cv2.resizeWindow('new', 1280, 680)
cv2.imshow('new', 0)

#等窗口的显示时长,0则一直显示
key = cv2.waitKey(0)
#接收到q则关闭窗口
if(key == 'q'):
  exit()
cv2.destroyAllWindows()

二.加载图片

import cv2
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread('/home/lyd/pyHub/unbox_yolov5_deepsort_counting/image/bus.jpg')
cv2.imshow('img', img)
#等窗口的显示时长,0则一直显示
key = cv2.waitKey(0)
if(key & 0xFF == ord('q')):
    cv2.destroyAllWindows()

三.保存图片

  • imwrite(name, img)
  • name:需要保存的文件名
  • img:是Mat类型(保存图片的类型)
import cv2
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread('/home/lyd/pyHub/unbox_yolov5_deepsort_counting/image/bus.jpg')
cv2.imshow('img', img)
#等窗口的显示时长,0则一直显示
key = cv2.waitKey(0)
if(key & 0xFF == ord('q')):
    cv2.destroyAllWindows()
elif(key & 0xFF == ord('s')):
#保存路径+名字
   cv2.imwrite('/home/lyd/pyHub/unbox_yolov5_deepsort_counting/image/bus.png', img)

四.视频采集(从摄像头内)

  • VideoCapure(device_num,CAP_V4L2:一般为Linux下;CAP_DSHOW:WIN下):打开一个虚拟摄像头,一般第一个为0
  • cap.read():读取摄像头信息(读取摄像头采集的一帧一帧数据)
    1. 返回两个值,第一个为状态值,读到帧为true,反之false
    2. 第二个为视频帧
  • cap.release():释放资源
import cv2
#获取视频设备
cv2.namedWindow("video", cv2.WINDOW_AUTOSIZE)
cap = cv2.VideoCapture(0)
while True:
    #从摄像头读取视频帧
    ret, frame = cap.read()
    
    #输出:(480, 640, 3)
    print(numpy.shape(frame))
    #将视频帧展示
    cv2.imshow(cv2.imshow('video', frame))
    #等待键盘事件,如果为q则退出
    key = cv2.waitKey(0)
    if(key & 0xFF == ord('q')):
        break

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

五.视频采集(从视频文件内)

  1. 与视频读取无区别,只是把参数换为文件
  2. 如果要跟原视频同速度,只需要把等待时间设置为1000/22。一般视频每秒22帧,就是22FPS,1000就是一秒。
import cv2
#获取视频设备
cv2.namedWindow("video", cv2.WINDOW_AUTOSIZE)
#与视频读取无区别,只是把参数换为文件
cap = cv2.VideoCapture('/media/lyd/文档1/出苗率/data_origin1/DJI_0003.MP4')
while True:
    #从摄像头读取视频帧
    ret, frame = cap.read()
    
    #输出:(480, 640, 3)
    print(numpy.shape(frame))
    #将视频帧展示
    cv2.imshow(cv2.imshow('video', frame))
    #等待键盘事件,如果为q则退出
    key = cv2.waitKey(int(1000/24))
    if(key & 0xFF == ord('q')):
        break

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

六.视频录制

  • 将视频数据录制成视频文件
  • VideoWriter()
    • 参数一为输出文件
    • 参数二为多媒体(编码器)文件格式(VideoWriter_fourcc):常见MJPG(.MP4),X264
      cv.VidwoWriter_fourcc(*‘MJPG’) or
      cv.VidwoWriter_fourcc(‘M’,‘J’,‘P’,‘G’)
    • 参数三为帧率
    • 参数四为分辨率
  • write():上面类调用此方法就可保存数据
  • relase():清除视频的缓冲区
import cv2
import numpy

#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG') # 多媒体格式
#采集分辨率必须与摄像头一致,不然会出错
vw = cv2.VideoWriter('/home/lyd/pyHub/unbox_yolov5_deepsort_counting/image/out.mp4', fourcc, 25, (640, 480))

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

#获取视频设备/从视频文件中读取视频帧
cap = cv2.VideoCapture(0)
while True:
    #从摄像头读取视频帧
    ret, frame = cap.read()
    print(numpy.shape(frame))
    # 将视频帧展示
    cv2.imshow('video', frame)
    vw.write(frame)
    key = cv2.waitKey(int(1000/24))
    if (key & 0xFF == ord('q')):
        break

#释放Videoapture
cap.release()
#释放Vidworiter
vw.replace()
cv2.destroyAllWindows()

七.代码优化

  • 显示窗口为什么变大了?
  • 使用isOpened()判断摄像头是否开启
  • 采集数据时要判断数据是否获取到了
import cv2
import numpy

#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG') # 多媒体格式
#采集分辨率必须与摄像头一致,不然会出错
vw = cv2.VideoWriter('/home/lyd/pyHub/unbox_yolov5_deepsort_counting/image/out.mp4', fourcc, 25, (640, 480))

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

#获取视频设备/从视频文件中读取视频帧
cap = cv2.VideoCapture(0)

#此处解决了问题2,判断视频是都打开了
while cap.isOpened():
    #从摄像头读取视频帧
    ret, frame = cap.read()
    #解决了问题3判断是否读取到数据
    if ret == True:
        print(numpy.shape(frame))
        #将视频帧展示
        cv2.imshow('video', frame)
        # 此处解决了问题1,因为会把视频撑大,展示前将其固定住
        cv2.resizeWindow('video', 640, 360)

        vw.write(frame)
        key = cv2.waitKey(int(1000 / 24))
        if (key & 0xFF == ord('q')):
            break
    else:
        break

#释放Videoapture
cap.release()
#释放Vidworiter
vw.replace()
cv2.destroyAllWindows()

八.Opencv控制鼠标

  1. 设置鼠标回调函数
  • setMouseCallback(winname,callback,userdata)
    • winname:控制的窗口
    • callback:设置鼠标点盘操作窗口后的响应函数
    • 给回调函数设置传递参数
  • callback(event,x,y,flags,userdata):回调函数(函数名可自拟)
    • event:鼠标事件(鼠标的点击事件)
    • x,y:鼠标所在位置
    • flags:主要用于组合键(例如按shift+鼠标键 or ctrl+鼠标键)
    • userdata:上面传过来的
import cv2
import numpy as np

#鼠标回调响应函数
def mouse_callback(event, x, y, flags, userdata):
    print(event, x, y, flags, userdata)

#创建显示窗口
cv2.namedWindow("mcallb", cv2.WINDOW_AUTOSIZE)
cv2.resizeWindow('mcallb', 640, 360)

#设置鼠标响应
cv2.setMouseCallback('mcallb', mouse_callback, "123")

# 创建图像背景
img = np.zeros((360, 640, 3), np.uint8)
while True:
    cv2.imshow("mcallb", img)
    key = cv2.waitKey(10)
    if key & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

九.TrackBar控件

  • createTrackbar
    • 1.1trackbarname:控件名字

    • 1.2winname:打开窗口名字

    • 2.1value:trackbar当前值

    • 3.1count:最小值为0,最大值为count

    • 4.1callback:回调函数

    • 4.2userdata:回调函数输入值

  • getTrackbarPos
    • trackbarname:控件名
    • winname:所在窗口名
    • 返回值:当前值(Trackbar所在值)

十.【实战】使用TrackBar控件

import cv2
import numpy as np

# 回调函数
def callback():
    pass

# 创建窗口
cv2.namedWindow("trackbar", cv2.WINDOW_AUTOSIZE)

# 创造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(10)
    if key & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值