关于OpenCV for Python入门-图片和摄像头显示

2022-04-02 14:45:26 浏览数 (1)

OpenCV和Python结合的学习资料不多,网上的资料更是鱼目混杂,推荐大家OpenCV官方教程中文版 for Python,建议自行下载。

其实也算不上原创,多方摘取学习,是opencv学习的开始。

OpenCV三个最核心和常用的模块

core:核心模块,主要包含了OpenCV中最基本的结构(矩阵,点线和形状等),以及相关的基础运算/操作。

imgproc:图像处理模块,包含和图像相关的基础功能(滤波,梯度,改变大小等),以及一些衍生的高级功能(图像分割,直方图,形态分析和边缘/直线提取等)。-

highgui:提供了用户界面和文件读取的基本函数,比如图像显示窗口的生成和控制,图像/视频文件的IO等。

针对视频和一些特别的视觉应用,OpenCV也提供了强劲的支持:

video:用于视频分析的常用功能,比如光流法(Optical Flow)和目标跟踪等。

calib3d:三维重建,立体视觉和相机标定等的相关功能。

features2d:二维特征相关的功能,主要是一些不受专利保护的,商业友好的特征点检测和匹配等功能,比如ORB特征。

object:目标检测模块,包含级联分类和Latent SVM

ml:机器学习算法模块,包含一些视觉中最常用的传统机器学习算法。

flann:最近邻算法库,Fast Library for Approximate

Nearest Neighbors,用于在多维空间进行聚类和检索,经常和关键点匹配搭配使用。-

gpu:包含了一些gpu加速的接口,底层的加速是CUDA实现。

photo:计算摄像学(Computational Photography)相关的接口,当然这只是个名字,其实只有图像修复和降噪而已。

stitching:图像拼接模块,有了它可以自己生成全景照片。

nonfree:受到专利保护的一些算法,其实就是SIFT和SURF。

contrib:一些实验性质的算法,考虑在未来版本中加入的。

legacy:字面是遗产,意思就是废弃的一些接口,保留是考虑到向下兼容。

ocl:利用OpenCL并行加速的一些接口。

superres:超分辨率模块,其实就是BTV-L1(Biliteral Total Variation – L1 regularization)算法

viz:基础的3D渲染模块,其实底层就是著名的3D工具包VTK(Visualization Toolkit)

通过opencv开始真简单的图像展示,hello world!

代码语言:javascript复制
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 读取图片
img = cv.imread("ldh.jpeg",cv.IMREAD_COLOR)
# 显示图片
cv.imshow('image', img)
# 等待键盘响应
cv.waitKey(0)
# 删除建立窗口
cv.destroyAllWindows()
代码语言:javascript复制
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# -----------------------------opencv常用操作----------------------------------
# cv2.imread(filepath,flags) 读入图像
# ----------------参数----------------
# cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略,这是默认参数。
# cv2.IMREAD_GRAYSCALE:以灰度模式读入图像
# 不加此参数,默认是彩色
# cv2.imshow(wname,img) 显示图像
# 第一个参数是显示图像的窗口的名字
# 第二个参数是要显示的图像(imread读入的图像),窗口大小自动调整为图片大小
# cv2.imwrite(file,img,num)  保存图像
# 第一个参数是要保存的文件名
# 第二个参数是要保存的图像。可选的第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95。
# 第三个参数表示的是压缩级别。默认为3.
# img.copy()    #图像复制
# cv2.cvtColor(img,cv2.converttype)  图像颜色空间转换
# opencv 中有多种色彩空间,包括 RGB、HSI、HSL、HSV、HSB、YCrCb、CIE XYZ、CIE Lab 8 种,使用中经常要遇到色彩空间的转化。
# 1、Gray色彩空间  GRAY:灰度图像,其中灰度值由0-255构成八位二进制数
# 2、XYZ色彩空间  XYZ:一种便于计算的色彩空间
# 3、YCrCb色彩空间 YCrCb:一种更能描述人眼视觉的色彩空间
#   Y:光亮
#   Cr和Cb:Cr表示红色色度,Cb表示蓝色色度
# 4、HSV色彩空间 HSV色彩空间从心理学和视觉的角度出发。
#   色调(Hue,也称为色相)色调指光的颜色,色调与混合光谱中的主要光波长相关。色调的取值区间为[0, 360]。
#   饱和度(Saturation)饱和度是指色彩的深浅程度,指一种颜色混合白光的数量。饱和度取值范围是[0, 1
#   亮度(Value)亮度指人眼感受到的光的明暗程度。指的是颜色能掺入白色的多少。亮度取值范围也是[0, 1]
# 5、HLS色彩空间 HLS:将HSV中的V:亮度换成了L:光亮度/明度
#   色调H(Hue):如同HSV中的色调,用一个360度的色环表示。
#   光亮度/明度L(Lightness):用来控制色彩的明暗变化,它的取值范围也是[0, 1]。
#   饱和度S(Saturation):如同HSV中的色调。
# 6、CIELab色彩空间 CIELab色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。
#   L:分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白。
#   A:分量表示从红色到绿色的范围,取值范围是[-127,127]。
#   B:分量表示从黄色到蓝色的范围,取值范围是[-127,127]。
# 7、CIELuv色彩空间 CIELuv也是均匀的颜色模型,适用于显示器显示和根据加色原理进行组合的场合,该模型中比较强调对红色的表示,即对红色的变化比较敏感,但对蓝色的变化不太敏感。
#   L:取值范围为[0 - 100]
#   U:取值范围为[-134 - 220]
#   V:取值范围为[-140 - 122]
# 8、Bayer色彩空间 Bayer色彩空间(Bayer模型)被广泛地应用在CCD和CMOS相机中。它能够从单平面R、G、B交错表内获取彩色图像。输出的RGB图像的像素点值,是根据当前点的1个、2个或4个邻域像素点的相同颜色的像素值获得的。
# img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)   #灰度化:彩色图像转为灰度图像
# img3 = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)   #彩色化:灰度图像转为彩色图像
# cv2.resize(image, image2,dsize)     #图像缩放:(输入原始图像,输出新图像,图像的大小)
# cv2.flip(img,flipcode)                       #图像翻转,flipcode控制翻转效果。
#   flipcode = 0:沿x轴翻转;flipcode > 0:沿y轴翻转;flipcode < 0:x,y轴同时翻转
# cv2.warpAffine(img, M, (400, 600))       #图像仿射变换 :平移;裁剪、剪切、旋转、仿射变换,
#   M、M_crop、M_shear、M_rotate
# cv2.putText(img,'text',(50,150)   #图像添加文字:(照片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细)
# cv2.namedWindow('image', cv2.WINDOW_NORMAL) 命名窗口
# 初始设定函数标签是 cv2.WINDOW_AUTOSIZE,自动调整大小
# cv2.WINDOW_NORMAL,你就可以调整窗口大小了。当图像维度太大,或者要添加轨迹条时,调整窗口大小将会很有用
# ------------------读取彩色图片------------------
img = cv.imread("ldh.jpeg",cv.IMREAD_COLOR)
# 显示图片
cv.imshow('image', img)
# cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫秒级。
# 函数等待特定的几毫秒,看是否有键盘输入。
# 特定的几毫秒之内,如果按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。
# 如果没有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限期的等待键盘输入。
# 它也可以被用来检测特定键是否被按下,例如按键 a 是否被按下。
cv.waitKey(0)
# cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。
# 如果你想删除特定的窗口可以使用 cv2.destroyWindow(),在括号内输入你想删除的窗口名。
cv.destroyAllWindows()

# ------------------读取灰度图片------------------
# 以灰度模式读入图像
img = cv.imread("ldh.jpeg",cv.IMREAD_GRAYSCALE)
cv.imshow('image', img)
cv.waitKey(0)
cv.destroyAllWindows()


img = cv.imread('ldh.jpeg',cv.IMREAD_COLOR)
cv.imshow('image',img)
# keycode 1 = 鼠标左键
# keycode 2 = 鼠标右键
# keycode 3 = Cancel
# keycode 4 = 鼠标中键
# keycode 8 = BackSpace
# keycode 9 = Tab
# keycode 12 = Clear(未知)
# keycode 13 = Enter
# keycode 16 = Shift_L
# keycode 17 = Control_L
# keycode 18 = Alt_L
# keycode 19 = Pause
# keycode 20 = Caps_Lock
# keycode 27 = Escape
# keycode 32 = space
# keycode 33 = Prior(PageUp键)
# keycode 34 = Next(PageDown键)
# keycode 35 = End
# keycode 36 = Home
# keycode 37 = Left
# keycode 38 = Up
# keycode 39 = Right
# keycode 40 = Down
# keycode 41 = Select(未知)
# keycode 42 = Print(PrintScreen键)
# keycode 43 = Execute(未知)
# keycode 45 = Insert
# keycode 46 = Delete
k = cv.waitKey(0)
# 按Esc=27,退出
if k == 27:
    cv.destroyAllWindows()
# 按s键,保存图片退出
elif k == ord('s'):
    cv.imwrite('ldhbak.jpeg',img)
    cv.destroyAllWindows()

# 用matplotlib显示图片
img = cv.imread('ldh.jpeg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])
plt.show()

关于读取摄像头的操作

代码语言:javascript复制
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt


# 处理摄像头视频
# 创建一个 VideoCapture 对象。他的参数可以是设备的索引号,或者是一个视频文件,笔记本内置涉嫌头一般是0
# cv2.VideoCapture()
# cap.read() 返回一个布尔值(True/False)。如果帧读取的是正确的,就是 True。
# 使用 cap.isOpened(),来检查是否成功初始化了
# 如果返回值是True,那就没有问题。
# 否则就要使用函数 cap.open()。
# cap.get(propId) 来获得视频的一些参数信息
#   0-视频文件的当前位置毫秒
#   1-下一步要解码/捕获的帧的基于0的索引
#   2-视频文件的相对位置:0-胶片开始,1-胶片结束
#   3-视频流中帧的宽度
#   4-视频流中帧的高度
#   5-帧率
#   6-编解码器的4字符代码
#   7-视频文件中的帧数。
#   8-返回mat对象的格式
#   9-后端特定值,指示当前捕获模式
#   10-图像的亮度–仅适用于相机
#   11-对比度–仅用于相机
#   12-饱和度–仅用于相机
#   13-色调–仅用于相机
#   14-增益–仅用于相机
#   15-曝光–仅用于相机
#   16-布尔标志,指示是否应将图像转换为RGB。
#   17-当前不受支持
#   18-立体摄像机的校正标志注:目前仅受DC1394 v 2.x后端支持
# 对应的,使用 cap.set(propId,value) 来修改视频属性,value 就是你想要设置成的新值
# 创建一个 VideoCapture 对象。他的参数可以是设备的索引号,或者是一个视频文件,笔记本内置涉嫌头一般是0
cap = cv.VideoCapture(0)

while(True):
    # 一帧一帧获取视频码流
    ret, frame = cap.read()
    # 对帧进行颜色加工
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 实时显示帧信息
    cv.imshow('frame',gray)
    #响应按键,退出
    if cv.waitKey(1) & 0xFF == ord('q'):
        break
# 释放摄像头,删除窗口
cap.release()
cv.destroyAllWindows()



# 是从摄像头中捕获视频,沿水平方向旋转每一帧并保存它
# 创建一个 VideoWriter 的对象。
# 确定一个输出文件的名字。
# 指定 FourCC 编码.
#   FourCC 就是一个 4 字节码,用来确定视频的编码格式
# 播放频率和帧的大小也都需要确定。
# 最后一个是 isColor 标签。
#   如果是 True,每一帧就是彩色图,否则就是灰度图
# 打开当前摄像头
cap = cv.VideoCapture(0)
# 定义视频的编码格式
fourcc = cv.VideoWriter_fourcc(*'XVID')
# 定义输出文件,含文件名,视频的编码格式,帧数,帧大小
out = cv.VideoWriter('output.avi',fourcc, 20.0, (640,480))
# 确定当前摄像头打开后,进行捕捉
while(cap.isOpened()):
    # 获取返回值和帧
    ret, frame = cap.read()
    if ret==True:
        # flip()的作用是使图像进行翻转
        #   filename:需要操作的图像
        #   flipcode:翻转方式
        #       1  水平翻转
        #       0  垂直翻转
        #       -1 水平垂直翻转
        frame = cv.flip(frame,0)

        # 将处理后的帧写入输出文件
        out.write(frame)
        # 并在当前窗口显示帧
        cv.imshow('frame',frame)
        # 按键退出
        if cv.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
# 释放输入流输出流,关闭窗口
cap.release()
out.release()
cv.destroyAllWindows()

0 人点赞