1 Star 0 Fork 8

Dawish/opencv

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
_1读写.py 9.74 KB
一键复制 编辑 原始数据 按行查看 历史
18151521911@163.com 提交于 2022-02-26 18:27 . 代码格式调整
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 12 19:04:50 2018
@author: zy
"""
'''
OPenCV3 计算机视觉 笔记
第二章 : 处理文件,摄像头和图形用户界面
基本知识
1.读写图像文件
2.图像与原始字节之间的转换
3.使用numpy.array访问图像数据
4.视频文件的读写(复制视频)
5.捕获摄像头的帧,并保存视频文件
6.窗口显示图像
7.在窗口显示摄像头帧
'''
import cv2
import numpy as np
import os
'''
1.读写图像文件
'''
'''
OpenCV的imread()和imwrite()函数能支持各种静态图像文件格式。不同系统支持的文件格式不一样,但是都支持bmp格式,通常还支持
png,jpeg,tiff格式文件
bmp格式:每个像素每个通道为8位
png:每个像素每个通道为8位或者16位
'''
#通过二维numpy数组创建一个黑色的正方形图像
img = np.zeros((3,3),dtype=np.uint8)
#输出 每一个像素都是8位整数 范围0-255 图片大小为3x3
print(img) #[[0 0 0]
# [0 0 0]
# [0 0 0]]
print(img.shape) #(3, 3)
#利用cvtColor()函数将图像转换为blue-green-red(BGR)格式
img = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
#输出维度为3x3x3 表明图像大小为3x3 有三个通道 每个像素由一个三元数组表示(B,G,R)
print(img) # [[[0 0 0]
# [0 0 0]
# [0 0 0]]
# [[0 0 0]
# [0 0 0]
# [0 0 0]]
# [[0 0 0]
# [0 0 0]
# [0 0 0]]]
print(img.shape) #(3, 3, 3)
#把png图像转换为jpeg格式
root = '.\image'
file = os.path.join(root,'test.bmp')
#加载OpenCV图像最简单的方式是使用imread函数,该函数会返回一副图片,这幅图片是一个数组(根据imread()输入参数的不同,该图像可能是一个二维数组,也可能是三维数组)
#在默认情况下,即使文件是灰度格式,imread()函数也会返回BGR格式的图像
#BGR和RGB所表示的色彩空间相同,字节顺序相反
img = cv2.imread(file) #读bmp格式取图片
cv2.imwrite('test.jpg',img) #保存成jpg格式
#按照指定参数读取图片 加载bmp文件作为灰度图像(丢失颜色信息)
gray_image = cv2.imread(file,cv2.IMREAD_GRAYSCALE)
#保存为灰度的jpg图像
cv2.imwrite('test_gray.jpg',gray_image)
'''
2.图像与原始字节之间的转换
'''
'''
一个OpenCV图像一般是numpy.array类型的二维或者三维数组
8位的灰度图像是一个含有字节值得二维数组 height x width
24位的BGR是一个三维数组 height x width x channel
'''
img = cv2.imread(file) #读bmp格式取图片
print('图像{0}的维度为{1}'.format(file,img.shape))
#显示的转换为一维的python bytearray格式
byte_array = bytearray(img) #图像.\image\test.bmp的维度为(45, 50, 3)
print('转换之后的维度为:',len(byte_array),type(byte_array)) #转换之后的维度为: 6750 <class 'bytearray'>
#bytearray含有恰当顺序的字节,可以通过显示转换和重构 得到numpy.array形式的图像
img = np.asarray(byte_array).reshape(45,50,3)
#cv2.imshow('window 1',img)
#cv2.waitKey(10) #等候10ms
'''
一个详细的例子 将含有随机字节的bytearray转换为灰度图像和BGR图像
'''
#随机生成120,000个字节的数组
random_byte_array = bytearray(os.urandom(120000)) #生成随机字节
#转换成numpy.array类型
byte_array = np.asarray(random_byte_array,dtype=np.uint8)
#把数组转换成 400 x 300的灰度图像
gray_image = byte_array.reshape(300,400)
cv2.imwrite('test_gray.png',gray_image)
#把数组转换成 400 x 100的BGR图像
bgr_image = byte_array.reshape(100,400,3)
cv2.imwrite('test_bgr.png',bgr_image)
'''
3.使用numpy.array访问图像数据
'''
#将BGR图像在(0,0)处的像素转化为白像素
img = cv2.imread('test.jpg')
img[0,0] = [255,255,255]
#img[0,0]操作和下面操作一样
'''
numpy.array的item(n_hight,n_width,n_channel)方法可以获取指定索引的值 通道BGR依次对应索引0,1,2
'''
print(img.item(25,26,0)) #获取25列26行B通道的值 222
img.itemset((25,26,0),155) #设置新的值
print(img.item(25,26,0)) #155
#将指定通道的所有值置为零
img[:,:,1] = 0 #将G通道像素值全部置为零
'''
1.读取感兴趣区域,并把值赋值给一个变量
2.同理设定第二个区域,赋值给另一个变量
3.将第一个我区域的值赋值给第二个区域 (将图像一部分拷贝到图像另一部分)
'''
img = cv2.imread('./image/img1.jpg')
my_roi = img[800:1000,300:500]
img[0:200,200:400] =my_roi
#cv2.imshow('window 2',img)
#cv2.waitKey(10) #等候10ms
print(img.shape) #(1080, 1920, 3) 图像的高度,宽度,和通道数
print(img.size) #36220800 图像的大小
print(img.dtype) #uint8 图像的数据类型
'''
4.视频文件的读写(实现视频的复制)
OpenCV提供了VideoCapture类和VideoWriter类来支持各种格式的视频文件。
支持的格式类型会因系统的不同而变化,但是都支持avi格式
在到达视频文件末尾之前,VideoCapture可通过read()函数来获取新的帧,每一帧都是一幅基于BGR的图像
'''
'''
将一幅图像传递给VideoWriter类的write()函数,该函数会将这幅图像加到VideoWriter类所指向的文件中
'''
video_capture = cv2.VideoCapture('./video./2.mp4')
#获取帧速率
fps = video_capture.get(cv2.CAP_PROP_FPS)
print('该视频的帧速率为:',fps) #该视频的帧速率为: 30.009902511911992
#获取图片的宽和高
size =(int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('该视频每一帧的大小为:',size) #该视频每一帧的大小为: (544, 960)
#1.VideoWriter类的构造函数指定视频文件名,这个文件名对应的文件若存在,则会被覆
#2.需要指定编解码器
#3.帧速率
#4.帧大小
video_writer = cv2.VideoWriter('./video/4.avi',cv2.VideoWriter_fourcc('m','p','4','v'),fps,size)
success,frame = video_capture.read()
cv2.imwrite('./video/frame.jpg',frame)
#读取帧,直至没有帧可以读取
while success:
#写入一帧
video_writer.write(frame)
#读取一帧
success,frame = video_capture.read()
video_writer.release()
video_capture.release()
'''
5.捕获摄像头的帧(保存视频文件)
VedioCapture类可以获得摄像头的帧流,但对于摄像头而言,通常不是用视频的文件名来构造VideoCapture类
而是需要传递摄像头的设备索引
VideoCapture类对象的get方法不能返回摄像头帧速率的准确值,他总是返回0
'''
#获取摄像头10s的视频信息,并将其写入一个avi文件中
camera_capture = cv2.VideoCapture(0)
#OpenCV没有提供任何查询摄像头数量和属性的方法。如果使用无效的索引构造了VideoCapture类,就得不到帧,read方法
#就会返回 False,None 因此需要在读取前判断一下设备是否已经打开
if camera_capture.isOpened():
fps = 30 #假设帧大小
#获取图片的宽和高
size =(int(camera_capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(camera_capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
#1.VideoWriter类的构造函数指定视频文件名,这个文件名对应的文件若存在,则会被覆
#2.需要指定编解码器
#3.帧速率
#4.帧大小
video_writer = cv2.VideoWriter('./video/camera.avi',cv2.VideoWriter_fourcc('m','p','4','v'),fps,size)
success,frame = camera_capture.read()
num_frame_remaining = 10*fps - 1 #当前剩余捕获图像个数
while success and num_frame_remaining > 0 and cv2.waitKey(1)==-1:
#显示拍照
cv2.imshow('frame',frame)
#写入一帧
video_writer.write(frame)
#读取一帧
success,frame = camera_capture.read()
num_frame_remaining -= 1
#释放
camera_capture.release()
video_writer.release()
'''
6 窗口显示图像
imshow()函数可以用来实现图片,但是这个图片显示出来后会立即消失,一般我们需要使用waitKey()函数,
传入等待键盘触发的时间,单位为ms,返回值为-1(表示没有键按下)或者ASCII码。并且需要调用destoryAllWindows()
释放OpenCV创建的所有窗口
'''
img = cv2.imread('./image/img2.jpg')
cv2.imshow('window 3',img)
cv2.waitKey(10)
'''
7.在窗口显示摄像头帧
'''
clicked = False
def on_mouse(event,x,y,flag,param):
'''
#鼠标事件的回调函数
args:
event:回调事件参数,有很多取值,分别对应不同的鼠标事件
param:可选参数,它是setMouseCallback()函数的第三个参数 默认为0
flag:标志参数 如 cv2.EVENT_FLAG_LBUTTON:该事件对应按下鼠标左键
x,y:鼠标坐标
'''
global clicked
#鼠标左键松开
if event == cv2.EVENT_LBUTTONUP:
clicked = True
camera_capture = cv2.VideoCapture(0)
#指定窗口名来创建窗口
cv2.namedWindow('window 4')
#设置鼠标事件回调函数 来获取鼠标输入
cv2.setMouseCallback('window 4',on_mouse)
print('Showing camera feed.Click window or press any key to stop')
success,frame = camera_capture.read()
#OpenCV窗口只有在调用cv2.waitKey()函数时才会更新,并且waitKey()函数只有在OpenCV窗口成为活动窗口时,才能捕获输入信息
while success and cv2.waitKey(1) == -1 and not clicked:
cv2.imshow('window 4',frame)
success,frame = camera_capture.read()
camera_capture.release()
cv2.waitKey(10) #等候10ms
cv2.destroyAllWindows() #销毁所有窗口
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/Dawish/opencv.git
git@gitee.com:Dawish/opencv.git
Dawish
opencv
opencv
master

搜索帮助