Loading

python使用opencv3 01 入门函数基础(根据《opencv3 计算机视觉 python语言实现》总结)

先解决一个问题,为什么opencv3在python中的导入方式是import cv2?

简单的解释一下,就是这里的数字‘2’并不代表版本号,而是代表一些别的东西。想要知道opencv的版本就输入指令 print(cv2.__verson__)

我在网上找到了原文 https://blog.csdn.net/saltriver/article/details/78166046

顺便提示一下,opencv是以numpy模块为基础,来处理数据。

 


 

 

首先介绍一下处理图片的基本知识

矩阵array[[[1,0,0],

      [0,0,0],

      [0,0,0]],

      [[2,0,0],

      [0,0,0],

      [0,0,0]],

      [[3,0,0],

      [0,0,0],

      [0,0,0]]

     ]

此矩阵为一个三维数组,可以表示一个BGR三通道形式表示的9个像素点的图片,每个像素点一般用三个8位(二进制)的数字来表示,所以每个像素的范围是0-255的三个数字组成的。

比如图片的左上角第一个像素点的蓝色B=1(array[0,0,0]),绿色G=2(array[1,0,0]),红色R=3(array[2,0,0])。

其他的色彩表示方法和BGR的形式差不多,只是取值范围或是通道数不同而已。(提示:在学习opencv时三色表示的顺序都是BGR,而不是一般人认为的RGB,具体我也不知道为什么)

 


 

 

然后列出一些基本的重点函数(只介绍一些常用的参数和常用的方法,具体可以自己查资料)

1.读取和保存图片的两个函数

cv2.imread(参数1,参数2)此处的参数1为字符串,内容为想要读取的图像的文件路径。参数2为数字,不同的数字可以控制函数返回不同形式的数字矩阵。

函数的作用:读取一个图像文件,默认返回三通道的BGR的数字矩阵。可控制参数2改变返回形式。

 

cv2.imwrite(参数1,参数2)此处的参数1为字符串,表示想要保存的路径和文件名。参数2为某数字矩阵

函数的作用:将一个数字矩阵转化成图片并按指定路径保存。

 

2.处理视频帧的一些函数(读取帧的操作往往伴随循环)

cv2.VideoCapture(参数1)此处的参数1为信号源

函数的作用:使某一视频文件或是摄像头作为帧的输入源。返回该输入源。

 

下面假设使用x来接收信号源,即以执行x = cv2.VideoCapture(参数1)为前提

x.read()

函数的作用:读取一帧的数据返回值有两个,依次是布尔值(判断成功与否),帧的内容。(再次调用则获取下一帧)。

 

x.get(参数1)此处的参数1为cv2的内置参数

函数的作用:这里介绍三个,当参数为cv2.CAP_PROP_FPS时,返回获取到的文件帧率。

             当参数为cv2.CAP_PROP_WIDTH时,返回获取到的文件画面的宽。

             当参数为cv2.CAP_PROP_HEIGHT时,返回获取到的文件画面的高。

 

cv2.VideoWrite(参数1,参数2,参数3,参数4)此处的参数1为字符串,表示保存路径及名称,参数2为cv2的内置参数编码器的不同模式,参数3为数字,表示帧率,参数4为数字,表示大小(宽高)

函数的作用:以参数1234确定的标准,返回一个即将保存的视频对象。

 

下面假设使用y来表示即将保存的视频对象,即以执行y = cv2.VideoWrite(参数1,参数2,参数3,参数4)为前提

y.write(参数1)此处的参数1为帧流即数字矩阵

函数的作用:将此帧写入视频对象。

 

y.release()

函数作用:释放摄像头。

 

3.管理窗口的一些函数

cv2.namedWindow(参数1)此处的参数1为字符串,表示窗口名

函数的作用:创建一个名为参数1的窗口。

 

cv2.imshow(参数1,参数2)此处的参数1为字符串,表示窗口名,参数2为要显示的内容(可以是图片也可以是视频或是摄像头等信号源)

函数的作用:将参数2的内容显示在名为参数1的窗口上(显示一下会立即消失,必须搭配waitkey()使用)。

 

cv2.destoryWindow(参数1)此处的参数1为字符串,表示要销毁的窗口名

函数的作用:将名为参数1的窗口销毁。

 

cv2.waitKey(参数1)此处的参数1为数字,表示等待时间,

函数的作用:当获取的键盘事件(键盘码)等于某个数值时,执行某操作。例如if cv2.waitKey(1) == 1: pass。

 

cv2.setMouseCallback(参数1,参数2)此处的参数1为字符串,表示绑定窗口,参数2为绑定函数的函数名

函数的作用:为名为参数1的窗口绑定鼠标事件,触发后执行参数2函数。

 


 

 

接着举一些例子,来实践一下这些函数

例1:读取一种格式的图像文件,然后将其保存成另一种形式

import cv2

image
= cv2.imread('mypic.png') cv2.imwrite('mypic.jpg', image)

 

例2:将含有随即字节的bytearray转换为灰度图和BGR图

import cv2
import numpy
import os


randomByteArray = bytearray(os.urandom(120000))  # 随机生成长度为120000的字节串,再将其转化成bytearray类型
flatNumpyArray = numpy.array(randomByteArray)  # 再转化为numpy.array方便操作
grayImage = flatNumpyArray.reshape(300, 400)  # 重塑为300x400的矩阵(前高后宽)
cv2.imwrite('randomgray.png', grayImage)  # 保存为单通道的灰度图

bgrImage = flatNumpyArray.reshape(100, 400, 3)  # 保存为BGR形式
cv2.imwrite('randomcolor.png', bgrImage)

 

例3:视频文件的读写

import cv2


videoCapture = cv2.VideoCapture('myvideo.mp4')  # 获取一个视频文件的对象
fps = videoCapture.get(cv2.CAP_PROP_FPS)  # 获取视频的帧率
size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))  # 获取视频画面的宽高
videoWrite = cv2.VideoWriter('Myoutput.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)  # 创建一个即将写入的视频文件对象
success, frame = videoCapture.read()  # 获取视频文件第一帧的画面
while success:  # 通过循环写入创建的视频文件
    videoWrite.write(frame)  # 写入一帧
    success, frame = videoCapture.read()  # 读取一帧

 

例4:捕获摄像头的帧,并保存

import cv2


videoCapture = cv2.VideoCapture(0)
fps = 30
size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWrite = cv2.VideoWriter('Myoutput.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
success, frame = videoCapture.read()
num = 10 * fps - 1
while success and num > 0:
    videoWrite.write(frame)
    success, frame = videoCapture.read()
    num -= 1
videoCapture.release()
#原理与上例类似

 

例5:在窗口显示图像

import cv2


img = cv2.imread('vacation.png')
cv2.imshow('my image', img)
cv2.waitKey()
cv2.destroyAllWindows()

 

例6:在窗口显示摄像头的帧

import cv2


clicked = False


def onMouse(event, x, y, flags, param):
    global clicked
    if event == cv2.EVENT_LBUTTONUP:
        clicked = True


cameraCapture = cv2.VideoCapture(0)
cv2.namedWindow('MyWindow')
cv2.setMouseCallback('MyWindow', onMouse)

print('正在显示摄像头画面,按任意键停止')
success, frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1 and not clicked:
    cv2.imshow('MyWindow', frame)
    success, frame = cameraCapture.read()
cv2.destroyAllWindows()
cameraCapture.release()
posted @ 2020-09-11 16:33  国家三级保护废物  阅读(156)  评论(0编辑  收藏  举报