基于python基础,自学计算机视觉,opencv学习及应用实例(第一天)

本文章是个人的自学笔记,有需要的朋友可以一起学习,写的不好的地方请谅解!

目录

opencv的介绍

一.图片&视频的加载与展示

1.图片加载、显示和保存

v2.imread(filename, flags) :读取加载图片

cv2.imshow(winname, mat) : 显示图片

cv2.waitKey(count) : 等待图片的关闭

cv2.imwrite(filename, img) : 保存图片

2.图像显示窗口的创建与销毁

cv2.namedWindow(winname, 属性):创建一个窗口

cv2.resizeWindow(winname, width, height)设置某个窗口大小

cv2.destroyWindow(winname):销毁某个窗口

cv2.destroyAllWindows():销毁所有窗口

 设置窗口退出按键

3.利用opencv从摄像头采集视频

cv2.VideoCapture

VideoCapture.release

VideoCapture.release

VideoCapture.read

VideoCapture.isOpened

4.利用opencv从多媒体文件中读取视频帧

 5.利用opencv将视频数据录制成多媒体文件

cv2.VideoWriter

cv2.VideoWriter.release

VideoWriter.write

6.opencv设置鼠标回调函数

cv2.setMouseCallback()

 7.Opencv中的Trackbar控件及使用


opencv的介绍

OpenCV 的出现极大地方便 了计算机视觉研究人员的算法验证,得到了众多研究者的喜爱。 经 过 20 年的发展,它已经成为计算机视觉领域最重要的研究工具之一

OpenCV的目标之一是提供一个简单易用的计算机视觉基础库,帮助人们快速构建复杂的视觉应用程序。 OpenCV库包含超过500个涵盖视觉领域的功能,包括产品检测,医疗成像,安全性,用户界面,摄像机校准,立体视觉和机器人。

那么今天我们就来学习以下opencv的基础

一.图片&视频的加载与展示

1.图片加载、显示和保存

  • v2.imread(filename, flags) :读取加载图片

  • cv2.imshow(winname, mat) : 显示图片

  • cv2.waitKey(count) : 等待图片的关闭

  • cv2.imwrite(filename, img) : 保存图片

import cv2
 
 
# 读取图片,第二个参数为False时,显示为灰度图像,True为原图
img = cv2.imread('c:\\people.jpg', flags=False)
 
# 显示图片,第一个参数为图片的标题, 第二个参数为你要展示的图片
cv2.imshow('image title', mat=img)
 
# 等待图片的关闭,不写这句图片会一闪而过,可以设置参数,为多少毫秒自动关闭
#例:cv2.waitKey(1000)为一秒后关闭,不写默认为零
cv2.waitKey(0)
 
# 保存图片,将灰度图片保存为
cv2.imwrite('c:\\Grey_img.jpg', img)

2.图像显示窗口的创建与销毁

  • cv2.namedWindow(winname, 属性):创建一个窗口

  • cv2.resizeWindow(winname, width, height)设置某个窗口大小

  • cv2.destroyWindow(winname):销毁某个窗口

  • cv2.destroyAllWindows():销毁所有窗口

winname作为窗口的唯一标识,如果想使用指定窗口显示目标图像,需要让cv2.imshow(winname)中的winname与窗口的winname需要保持一致。

窗口创建时可以添加的属性:

cv2.WINDOW_NORMAL:窗口大小可以改变(同cv2.WINDOW_GUI_NORMAL)
cv2.WINDOW_AUTOSIZE:窗口大小不能改变
cv2.WINDOW_FREERATIO:窗口大小自适应比例
cv2.WINDOW_KEEPRATIO:窗口大小保持比例
cv2.WINDOW_GUI_EXPANDED:显示色彩变成暗色
cv2.WINDOW_FULLSCREEN:全屏显示

cv2.WINDOW_OPENGL:支持OpenGL的窗口

 设置窗口退出按键

#设置窗口退出按键
#如果不设置的话,当按下任意键时窗口都会关闭
#设计思路,让其死循环,直到输入'q'
import cv2

cv2.namedWindow('img', cv2.WINDOW_NORMAL)  #创建一个窗口
cv2.resizeWindow('img', 640, 480)  #设置窗口大小
img = cv2.imread('C:\\picture\\20170701031428774.jpg')  #读取图片
while True:  #键盘只有输入'q'时退出
    cv2.imshow('img', img)  #显示图片
    key = cv2.waitKey()  #等待
    if (key & 0xFF == ord('q')):
        print('qqqq')
        break
    elif (key & 0xFF == ord('s')):
        print('ssss')
cv2.destroyAllWindows()  #销毁所有窗口

3.利用opencv从摄像头采集视频

cv2.VideoCapture

  • 原型:VideoCapture(*args,**kwargs)

  • 作用:初始化VideoCapture类并利用构造函数读入该视频的当前帧。

  • 参数:一般仅填入一个,即文件名。如果填入整数,则打开对应的捕获设备ID。若为0,则打开默认摄像头。

VideoCapture.release

  • 参数:无

  • 作用:关闭文件/摄像头

VideoCapture.release

  • 参数:无

  • 作用:关闭文件/摄像头

VideoCapture.read

  • 参数:无

  • 返回值:bool,numpy.array

  • 作用:读取该文件/摄像头的下一帧,成功与否由bool返回值决定,返回的帧矩阵为第二个参数

VideoCapture.isOpened

  • 参数:无

  • 作用:判断设备/文件是否读取成功,若成功,返回True

# 利用opencv将视频数据录制成多媒体文件
import cv2

# 创建videoWriter为写多媒体文件
# 创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
cap = cv2.VideoCapture(0)
# 获取摄像头帧宽度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# 获取摄像头帧高度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 视频编码格式
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
print(width)
print(height)
# 第四个参数一定要与自己摄像头采集的分辨率一致
vw = cv2.VideoWriter('c:\\picture\\out.mp4', fourcc, 20, (width, height))
while cap.isOpened():
    # 将视频帧在窗口中显示
    ret, frame = cap.read()
    cv2.imshow('video', frame)
    # 防止视频框变大,再设置一次窗口大小
    cv2.resizeWindow('video', 640, 480)

    # 写数据到多媒体文件
    vw.write(frame)
    # 等待键盘事件如果'q'退出
    key = cv2.waitKey(40)
    if (key & 0xFF == ord('q')):
        break

# 释放Videocapture
cap.release()
# 释放videoWrite
vw.release()
# 销毁所有窗口
cv2.destroyAllWindows()

演示就不演示了,长得不帅,大家可以自己试一下,前提自己的设备有摄像头.

4.利用opencv从多媒体文件中读取视频帧

# 利用opencv从多媒体文件中读取视频帧
import cv2

cv2.namedWindow('video', cv2.WINDOW_NORMAL)  #创建窗口
cv2.resizeWindow('video', 640, 480)
# 从视频文件中读取视频帧
cap = cv2.VideoCapture('C:\\picture\\ikun.mp4')

while True:
    ret, frame = cap.read()
    cv2.imshow('video', frame)  #将视频帧在窗口中显示

    key = cv2.waitKey(40)  #等待键盘事件如果'q'退出
    if (key & 0xFF == ord('q')):
        break

cap.release()  #释放Videocapture

cv2.destroyAllWindows()

 5.利用opencv将视频数据录制成多媒体文件

cv2.VideoWriter

  • 原型:cv2.VideoWriter(*args,**kwargs)

  • 参数:第一个,写入的视频文件名。第二个,由cv2.VideoWriter_fourcc返回的视频制式特定代码,通常有XVID,MPEG等。第三个,该视频的fps。第四个,一个tuple,为该视频的宽、高。

cv2.VideoWriter.release

  • 参数:无

  • 作用:释放videoWriter

VideoWriter.write

  • 原型:VideoCapture.write(image)

  • 作用:将当前帧内容写入视频文件

  • 参数:image,写入的当前帧

# 利用opencv将视频数据录制成多媒体文件
import cv2

# 创建videoWriter为写多媒体文件
# 创建窗口

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

cap = cv2.VideoCapture(0)
# 获取摄像头帧宽度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

# 获取摄像头帧高度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 视频编码格式
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
print(width)
print(height)
# 第四个参数一定要与自己摄像头采集的分辨率一致

vw = cv2.VideoWriter('c:\\picture\\out.mp4', fourcc, 20, (width, height))
# 判断摄像头是否为打开状态
while cap.isOpened():

    # 将视频帧在窗口中显示
    ret, frame = cap.read()

    # 采集数据判断是否获取到了
    if (ret == True):
        cv2.imshow('video', frame)

        # 防止视频框变大,再设置一次窗口大小
        cv2.resizeWindow('video', 640, 480)

        # 写数据到多媒体文件
        vw.write(frame)
        # 等待键盘事件如果'q'退出
        key = cv2.waitKey(40)
        if (key & 0xFF == ord('q')):
            break
    else:
        break

# 释放Videocapture
cap.release()
# 释放videoWrite
vw.release()
# 销毁所有窗口
cv2.destroyAllWindows()

6.opencv设置鼠标回调函数

(这里后面还会用到用鼠标画彩色矩形,可以先了解)

cv2.setMouseCallback()

  • 函数原型:

      void   SetMouseCallback(const string & winname,MouseCallback onMouse,void* userdata=0)

  • 参数:
  1. 第一个参数为窗口的名字,
  2. 第二个参数用来指定窗口每次鼠标时候发生的时候,被调用函数指针,
  3. 第三个参数则为用户定义的传递到回调函数的参数。

其中函数指针原型:

void Foo(int event ,int x ,int y ,int flags  ,void * param)

event 是鼠标响应类型,CV_EVENT_*变量之一:

EVENT_MOUSEMOVE滑动

EVENT_LBUTTONDOWN 左击

EVENT_RBUTTONDOWN 右击

EVENT_MBUTTONDOWN中键点击

EVENT_LBUTTONUP 左键放开

EVENT_RBUTTONUP 右键放开

EVENT_LBUTTONDBLCLK左键双击

EVENT_RBUTTONDBLCLK 右键双击

EVENT_MBUTTONDBLCLK 中键双击

x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)。

flags是CV_EVENT_FLAG的组合,flag的状态有:

EVENT_FLAG_LBUTTON 左键拖拽

EVENT_FLAG_RBUTTON 右键拖拽

EVENT_FLAG_MBUTTON 中键拖拽

EVENT_FLAG_CTRLKEY 按住Ctrl不放

EVENT_FLAG_SHIFTKEY 按住Shift不放

EVENT_FLAG_ALTKEY 按住Alt不放

param是用户定义的传递到setMouseCallback函数调用的参数。

import cv2
import numpy as np


def mouse_callback(event, x, y, flags, userdata):
    print(event, x, y, flags, userdata)


# mouse_callback(1, 100, 100, 16, "666")

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

# 设置窗口回调
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()

 7.Opencv中的Trackbar控件及使用

在这里我就不讲解Trackbar控件,这里有篇文章介绍

关于Trackbar的讲解

import cv2
import numpy as np


def callback():
    pass


# 创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)
# 创建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()

这里是一个简单的调色板

参考博客:

https://blog.csdn.net/Vici__/article/details/100714822

学习视频:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

笔写落去

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

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

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

打赏作者

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

抵扣说明:

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

余额充值