前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于OpenCV for Python入门-图片和摄像头显示

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

作者头像
python与大数据分析
发布2022-04-02 14:45:26
1.3K0
发布2022-04-02 14:45:26
举报

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()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档