OpenCV_01基本操作

 前言:总纲请查看《计算机视觉学习路》

环境配置:

新建requirements.txt,保存以下内容,然后执行命令创建虚拟环境

conda create --name py39-opencv --file requirements.txt

然后就可以在pycharm配置该环境进行编译

# This file may be used to create an environment using:
# $ conda create --name <env> --file <this file>
# platform: linux-64
_libgcc_mutex=0.1=conda_forge
_openmp_mutex=4.5=2_gnu
bzip2=1.0.8=h7f98852_4
ca-certificates=2022.5.18.1=ha878542_0
cvzone=1.5.6=pypi_0
cycler=0.11.0=pypi_0
evdev=1.5.0=pypi_0
fonttools=4.33.3=pypi_0
kiwisolver=1.4.2=pypi_0
ld_impl_linux-64=2.36.1=hea4e1c9_2
libffi=3.4.2=h7f98852_5
libgcc-ng=12.1.0=h8d9b700_16
libgomp=12.1.0=h8d9b700_16
libnsl=2.0.0=h7f98852_0
libuuid=2.32.1=h7f98852_1000
libzlib=1.2.11=h166bdaf_1014
matplotlib=3.5.2=pypi_0
ncurses=6.3=h27087fc_1
numpy=1.22.4=pypi_0
opencv-python=4.5.5.64=pypi_0
openssl=3.0.3=h166bdaf_0
packaging=21.3=pypi_0
pillow=9.1.1=pypi_0
pip=22.1.1=pyhd8ed1ab_0
pynput=1.7.6=pypi_0
pyparsing=3.0.9=pypi_0
python=3.9.12=h2660328_1_cpython
python-dateutil=2.8.2=pypi_0
python-xlib=0.31=pypi_0
python_abi=3.9=2_cp39
readline=8.1=h46c0cb4_0
setuptools=62.3.2=py39hf3d152e_0
six=1.16.0=pypi_0
sqlite=3.38.5=h4ff8645_0
tk=8.6.12=h27826a3_0
tzdata=2022a=h191b570_0
wheel=0.37.1=pyhd8ed1ab_0
xz=5.2.5=h516909a_1
zlib=1.2.11=h166bdaf_1014

1.创建窗口

使用Opencv的前提肯定是导入库啦

import cv2

1.窗口格式

创建一个名为new和new2的窗口:

cv2.nameWindow('new',cv2.WINDOW_AUTOSIZE) # 窗口不可以用鼠标进行拉伸

cv2.nameWindow('new2',cv2.WINDOW_NORMAL)   #  窗口可以用鼠标进行拉伸

cv2.imshow('new',0)   #用于显示new窗口

cv2.imshow('new2',0)  # 用于显示new2窗口

2.窗口停留和销毁

在进行imshow的时候,为了让窗口停留(即在桌面显示) ,我们可以通过cv2.waitkey(毫秒数)函数,例如,让窗口停留一秒:

cv2.waitkey(1000)

同时我们可以从键盘接收一个,当输入该值的时候,窗口才消失:

key=cv2.waitkey(0)   # 这里填0,即一直等待

while True:

        if key==113:   # 这里本来应该写if key == 'q',但是我这里输入q的时候,key的值为int类型的113

                break

在程序的最后我们需要销毁窗口:

cv2.destroyALLWindows() 

3.设置窗口大小

cv2.resizeWindow('new',640,480)  # 括号内的参数为:窗口名字,宽,高

4. 整体代码

import cv2

# 创建窗口
cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('new2',cv2.WINDOW_NORMAL)
cv2.resizeWindow('new',640,480)
cv2.resizeWindow('new2',480,640)
cv2.imshow('new', 0)  # 显示框口
cv2.imshow('new2', 0)  # 显示框口

while True:
    # 不断接收键盘按键
    key = cv2.waitKey(0)  # 接收键盘事件,如果输入q,则退出
    if key == 113:  # 按键q
        print("退出")
        break
cv2.destroyAllWindows()

 2.加载图片

cv2.imread(路径, flags) 

flags=0 : 读入灰色图片

flags=1:  读入彩色图片,BGR通道(忽略alpha通道)

flags=-1:  读入图片,包括alpah通道

flag也可以不写,默认flags=1

import cv2

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread('img/ex01.jpg',0)  #读入灰色通道图片

cv2.imshow('img', img)

key = cv2.waitKey(0)
if key == 'q':
    exit()

cv2.destroyAllWindows()

 如果flags不写,来看一下:

img = cv2.imread('img/ex01.jpg') 

3.保存图片

imwrite(name , img)

name:要保存的文件名

img:是Mat类型

下面判断,当键盘输入x的时候,保存图片为123.png 

import cv2

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread('img/ex01.jpg')
cv2.imshow('img', img)
while True:
    key = cv2.waitKey(0)
    print('key=',key)
    print('type=',type(key))
    if key == 113:  # 按键q
        print("退出")
        break
    elif key == 120:  # 按键x
        print("保存")
        cv2.imwrite('img/123.png',img)
    else:
        print('other')
cv2.destroyAllWindows()

 

 4. 读取视频文件

cap = cv2.VideoCapture(path)

这个时候cv2.waitkey( )里面的值就关系到视频播放速度的快慢,例如,我的视频为15帧/s,那么每一帧停留的时间为1000/15=66ms

 

import cv2

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

# 从视频文件读取视频帧
cap = cv2.VideoCapture('img/ex02.mp4')

while True:
    # 获取视频
    ret,frame = cap.read()
    cv2.imshow('video',frame)

    # 这里如果填0,则一直等待键盘事件,只能获取到一帧视频帧然后就停住了
    key = cv2.waitKey(66)
    if key == 113:
        break
# 释放资源
cap.release()
cv2.destroyAllWindows()

5.从摄像头读取视频

1.获取视频设备
cap = cv2.VideoCapture(0)  # 0表示笔记本内置摄像头,1为外置摄像头,其他数字为其他设备

2.从摄像头获取视频帧
ret,frame = cap.read()

read返回两个值,第一个为状态值,读到帧为True,第二个为视频帧

3.释放资源的操作为:

cap.release()

需要注意的是,想要将读取到的视频帧在窗口中显示出来,并且按q退出时,key = cv2.waitKey(1),括号里不能填0,可以填一个比较小的值。否则程序会一直等待键盘事件,这样一来就只能获取一帧图片,然后就卡住了。具体代码如下:

import cv2

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

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

while True:
    # 获取视频
    ret,frame = cap.read()
    cv2.imshow('video',frame)

    # 这里如果填0,则一直等待键盘事件,只能获取到一帧视频帧然后就停住了
    key = cv2.waitKey(1)
    if key == 113:
        break
# 释放资源
cap.release()
cv2.destroyAllWindows()

 6.视频录制保存

1.创建VieeoWriter

cv2.VideoWriter( )  # 参数:输出文件、int fourcc多媒体文件格式、帧率、分辨率(应复合摄像头参数)、颜色(默认True,彩色,填False则为灰色)

fourcc = cv2.VideoWriter_fourcc(*'MJPG')  # 多媒体文件格式  

2.写入数据

v2.write(获取到的视频帧)

3.释放资源:release( )

注:这里录好的视频是没有声音的,因为Opencv是处理图像的

这里对摄像头是否开启做了判断,并且对是否读到了视频帧也作了判断。 

import cv2

# 创建VideoWriter为多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
vw = cv2.VideoWriter('img/out.mp4', fourcc, 25, (1920, 1080))

cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 1920, 1080)

cap = cv2.VideoCapture(0)

while cap.isOpened():  # 判断摄像头是否打开
    ret, frame = cap.read()
    if ret:  # 判断是否为True,读到一帧显示一帧,如果为False,则不显示
        cv2.imshow('video', frame)
        vw.write(frame)  # 写数据到多媒体文件

        key = cv2.waitKey(1)
        if key == 113:
            break
    else:
        break

cap.release()
vw.release()
cv2.destroyAllWindows()

 

 7.鼠标控制

1.自定义回调函数,即鼠标进行操作后需要执行的命令

callback(event x,y,flags,userdata)  #  事件(鼠标移动,单击..) , 鼠标所在位置 , flags用于组合键

2.设置回调函数

cv2.setMouseCallback(窗口名字,callback, userdata)  # callback,用户自定义的逻辑函数   userdata是给callback的参数,默认为None

event可选值
flags可选值

 完整代码为:

import cv2
import numpy as np


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


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

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

# 利用numpy设置一个黑色的背景
img = np.zeros((480, 640, 3),np.uint8)
while True:
    cv2.imshow('mouse', img)
    key = cv2.waitKey(1)
    if key == 113:
        break

cv2.destroyAllWindows()

 8.滑块TrackBar操作

cv2.createTrackbar(trackbarname , 窗口名, value:trackbar当前的值 , count:拖动值的范围是0-count , callback , userdata) 

re = cv2.getTrackBarPos(trackbarname , 窗口名)  # 返回trackbar的当前值

下面做显示一副黑色图片,根据RGB滑动条变化图片颜色,先看效果:

import cv2
import numpy as np


def callback(a):
    pass


cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)

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')
    # 读取到r,g,b的值后对img进行操作
    img[:] = [b, g, r]  # 对img的所有像素赋值为刚才读取到的r,g,b值
    cv2.imshow('trackbar', img)
    key = cv2.waitKey(10)
    if key == 113:
        break

cv2.destroyAllWindows()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Goafan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值