"""转载请注明作者及出处"""
"""第一,我们可以认为图像是由一个个像素组成的二维数组,比如800X600的图像就是由
宽为800像素,高为600像素的二维像素阵列组成的。
第二,每个像素有各自的颜色,每个像素的数据必须要明确的储存该像素点呈现的颜色信息,
而颜色是由三个RGB值来表示,BGR(0~255,0~255,0~255),(有的地方是RGB)那么每个像素就是一个有着3个元素的一维数组,
比如[12,58,88]。
第三,一幅图像整体就是一个三维数组(像素组成二维阵列,像素本身又是一维数组)"""
"""一个图像有如下几种属性"""
from cv2 import cv2
import numpy as np
img = cv2.imread('1.jpg') #图片读取,参数是图像文件的路径
print(type(img)) #打印变量类型
#输出:<class 'numpy.ndarray'>
print(img.shape) #打印图片形状(高,宽,通道数),高宽的单位是像素数
#通道数是什么?并非所有图都是彩色图,黑白图可没有BGR三参,黑白图的通道数就是1,彩图通道数为3
#输出:(1953, 2922, 3)
print(img.size) #打印图片尺寸(尺寸=高X宽X通道数)
#输出:17119998
print(img.dtype) #打印数组元素类型
#输出:uint8 因为RGB颜色范围是0~255,8bit就足够了
pixel_data = np.array(img) #从图像生成纯粹的三维数组
print(pixel_data) #打印图片的像素数据矩阵
#当然,可以吧上述属性综合在一个函数中,调用函数即可全部显示
def get_img_info(img):
print("变量类型:%s" % type(img)) #打印变量类型
print("图片高、宽、通道数:%s,%s,%s" %
(img.shape[0],img.shape[1],img.shape[2])) #打印图片形状(高,宽,通道数)
print("图片尺寸:%s" % img.size) #打印图片尺寸(尺寸=高X宽X通道数)
print("数据类型:%s" % img.dtype) #打印表示图片RGB值得数据的数据类型(uint8 or uint16)
pixel_data = np.array(img)
print(pixel_data) #打印图片的像素数据矩阵
"""图像的读取、显示与写入"""
from cv2 import cv2
img = cv2.imread('1.jpg')
#图片读取,参数是图像文件的路径
"""------各种图像处理------"""
cv2.imshow("img_window",img)
#创建一个窗口名为"img_window",在该窗口中显示图像img
cv2.imwrite("D:/picture/result1.png",img)
#将图像对象img以指定文件名(result1.png)写入指定路径(D盘的picture文件夹)
cv2.waitKey(0)
#等待键盘的输入,接收到输入之后才会继续运行
cv2.destroyAllWindows()
#执行本行代码即会关闭之前打开的所有窗口,基本上所有opencv程序都有此代码
"""视频的读取、显示"""
from cv2 import cv2
import numpy as np
#当然,也可以不定义函数,这里只是为了展示几个方法
def video_demo():
capture = cv2.VideoCapture(0) #参数0表示捕获电脑摄像头的影像,此处创建了一个镜头捕获
while True:
ret, frame = capture.read() #通过while循环,将捕获到的摄像头的影像逐帧取出(frame),ret代表什么?
frame = cv2.flip(frame,1) #返回的是每一帧图片左右对调(参数1表示左右翻转)后的值,不然摄像头视角看到的人都是左右相反的
cv2.imshow("video",frame) #将此帧图片显示在窗口"video"中
k = cv2.waitKey(50) #50表示50ms,表示运行到此处,停50ms等待键盘输入
if k == 27: #27是键盘上Esc键的ASCII码,表示若50ms内你按Esc键此if语句判断为真
break
cv2.destroyAllWindows() #关闭所有窗口