OpenCV从入门到进阶(一)

opencv入门到进阶

一、图像与视频的加载与展示:

1、创建和显示窗口 import cv2

图像入门

● namedWindow(): 创建一个窗口,并给窗口起一个名字

参数:
	WINDOW_NORMAL:可调整窗口大小

	WINDOW_AUTOSIZE:不可调整窗口大小

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

● resizeWindow(‘name’,‘high’,‘width’):设置对应窗口大小

● imshow():显示窗口,参数:窗口名

● waitKey():窗口展示时间,单位ms ——>用来监听键盘和鼠标事件 0:一直显示监听键盘事件,如果输入q,则退出窗口

示例1

key=cv2.waitKey(0)  #监听到的事件返回给key
if(key=='q'):
	exit()

● destroyAllWindows():销毁窗口,释放系统资源

2、 加载图片

● imread(path,flag):

IMREAD_COLOR=1:加载彩色图像,任何图像的透明度都会被忽略

IMREAD_GRAYSCALE=0:以灰度模式加载图片

IMREAD_UNCHANGED=-1:加载图像,包括alpha通道

Note:

● 你可以简单地分别传递整数1、0、-1,而不是这三个flag

● 如果你使用的是 64 位机器,你需要修改key = cv.waitKey(0)像这样:key = cv.waitKey(0) & 0xFF

● 值得注意的是,如果文件的路径中包含有中文就会报错

提供以下解决方法

[采用了用numpy中的fromfile读取文件](https://blog.csdn.net/zhangycode/article/details/107936120 "采用了用numpy中的fromfile读取文件")

示例2

import cv2

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread("./img/img_1.jpg", 1)
cv2.imshow('image', img)
key = cv2.waitKey(0)
#改进:因为key实际得到的是输入指令的ascall所以,输入q不会退出
#只需要ord('q'),让他默认为ascall即可

#waitKey()返回的是int型,16位
#但是ascall是8位的,因此最严谨的写法为:
#取key的最后8位
if (key & 0xFF== ord('q')):
    cv2.destroyAllWindow()

3、 保存图片

● imwrite(name,img)

name,要保存的文件名

img,是Mat类型

示例3

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread("./img/img_1.jpg", 1)
while True:
    cv2.imshow('image', img)
    key = cv2.waitKey(0)
    if (key & 0xFF== ord('q')):
        break
    elif(key & 0xFF== ord('s')):
    #将图片保存到。。。。
        cv2.imwrite("./img/img_1_1.jpg",img)
    else:
        print("请重新输入")
cv2.destroyAllWindows()

4、 视频采集

视频入门

● VideoCapure():获取视频设备/从视频文件中读取视频帧

● cap.read()

返回两个值:

第一个为状态值,读到帧为true,第二个值为视频帧

动画片一秒24帧

● cap.release()

示例4

import cv2

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

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

while True:
    #从摄像头读取视频帧
    #cap.read的两个返回值
    ret,frame=cap.read()

    #将视频帧在窗口显示
    cv2.imshow('video',frame)

    #等待键盘事件
    #如果设为0,则停在一帧不动了,设短一点,让他循环
    key=cv2.waitKey(10)
    if(key& 0xFF==ord('q')):
        break

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

5、 读取视频文件

与视频采集操作类似,只需要修改VideoCapture()和waitKey()参数即可

示例5

import cv2

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

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

while True:
    #从摄像头读取视频帧
    #cap.read的两个返回值
    ret,frame=cap.read()

    #将视频帧在窗口显示
    cv2.imshow('video',frame)

    #等待键盘事件
    #如果设为0,则停在一帧不动了,设短一点,让他循环
    #视频速度与waitKey参数值有关
    key=cv2.waitKey(40)
    if(key& 0xFF==ord('q')):
        break

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

为cv.waitKey()使用合适的时间。如果它太小,视频将非常快,如果太大,视频将很慢 (嗯,这就是如何显示慢动作)。正常情况下,25 毫秒就可以了。

6、 视频录制

● VideoWriter

参数一:输出文件

参数二:多媒体文件格式(VideoWriter_fourcc)

参数三:帧率

参数四:分辨率大小(帧的大小)

● write:编码、写文件

● release

示例6


import cv2

# 创建videoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
# 须是摄像头真实分辨率1280*720,如果分辨率不一致不会给你写数据
vw = cv2.VideoWriter('./Video/video_2.mp4', fourcc, 25, (1280, 720))

cv2.namedWindow('video', cv2.WINDOW_NORMAL)
# 获取视频设备
cap = cv2.VideoCapture(0)

#while True:
#判断摄像头是否为打开状态
while cap.isOpened():
    # 从摄像头读取视频帧
    # cap.read的两个返回值
    ret, frame = cap.read()
    #采集数据时要判断数据是否获取到了
    if ret==True:
        # 将视频帧在窗口显示
        cv2.imshow('video', frame)
        # 写数据到多媒体文件
        vw.write(frame)

        # 等待键盘事件
        # 如果设为0,则停在一帧不动了,设短一点,让他循环
        key = cv2.waitKey(10)
        if (key & 0xFF == ord('q')):
            break
    else:
        print("未获取到数据")
        break

# 释放VideoCapture资源
cap.release()
# 释放VideoWriter资源
vw.release()
# 释放窗口
cv2.destroyAllWindows()

代码优化

● 显示窗口为什么变大了?

	在将要显示的时候再调用一次resizeWindow('video',640,360)

● 使用isOpened()判断摄像头是否已打开

● 采集数据时要判断数据是否获取到了

7、 鼠标控制

鼠标作为画笔

OpenCV: High-level GUI

设置鼠标回调函数:

● setMouseCallback(winname,callback,userdata)

● callback(event,x,y,flags,uesedata)

鼠标回调函数参数:

● event:鼠标移动、按下左键

● x,y:鼠标坐标

● flags:鼠标键和组合键

示例7


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, 360)

# 设置鼠标回调
cv2.setMouseCallback("mouse", mouse_callback, "123")

#随便窗口和背景
img = np.zeros((360, 640, 3), np.uint8)
while True:
cv2.imshow("mouse", img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()


8、 TrackBar控件

作为调色板的跟踪栏

OpenCV: High-level GUI

● createTrackbar

● getTrackbarPos:获得Trackbar当前值

createTrackbar参数:

● trackbarname:控件名,winname:窗口名

● value:trackbar当前值

● count:最小值为0,最大值为count

● callback,userdata

gettrackBarPos参数

● 输入参数:trackbarname

● 输入参数:winname

● 输出:当前值

示例9

import cv2
import numpy as np

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


def callback():
pass


# 创建trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)

# 设置背景640*480
img = np.zeros((480, 640, 3), np.uint8)

while True:
cv2.imshow('trackbar', img)

# 获取当前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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

茫渡。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值