day24 学习笔记

文章目录


前言

  • 目前,我开始学习OpenCV的相关概念和操作。通过今天的学习,我掌握了OpenCV的基础概念与图像操作

一、OpenCV简介

  • OpenCV(开放源代码计算机视觉库)是一个开源的计算机视觉和机器学习软件库。由一系列 C++ 类和函数构成,用于图像处理、计算机视觉领域的算法实现。
  • OpenCV-Python是原始OpenCV C++实现的Python包装器。
  • OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库。所有OpenCV数组结构都转换为Numpy数组。

二、计算机中的图像表达

1.图像表示

  • 像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。
  • 一系列像素组合到一起就形成了完整的图像。
  • 我们平常接触的图像都是8位数图像,范围从0到255,其中0,代表最黑,1,表示最白。
  • 日常生活中常见的图像是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的。

2.图像存储

  • 在OpenCV中,图像通过Numpy数组进行存储
  • 灰色图像使用二维数组,而彩色图像使用三维数组进行存储
  • 图像的常用属性分别为:shape和dtype,用于访问数组的形状和像素的数据类型
  • 需要注意的是:在OpenCV中,彩色图像以BGR顺序存储

三、基本图像操作

1.创建窗口

  • cv2.namedWindow(winname [,窗口属性])
  • winname指窗口名
  • 窗口属性包括:cv2.WINDOW_AUTOSIZE,cv2.WINDOW_NORMAL;用以指定窗口大小是否能进行调整
    tips:可以在imshow方法中指定窗口名从而省略该步骤
python 复制代码
cv.namedWindow('window1',cv.WINDOW_AUTOSIZE) #cv.WINDOW_AUTOSIZE表示不能调整窗口大小
cv.namedWindow('window2',cv.WINDOW_NORMAL) #cv.WINDOW_NORMAL表示可调整窗口

2.读取图像

  • cv2.imread(path [,读取方式])
  • 可以指定读取彩色或灰白图像
python 复制代码
img2 = cv.imread('cat1.png',cv.IMREAD_GRAYSCALE) #读为灰度图

3.显示图像

  • cv2.imshow(winname,img)
  • winname:显示图像的窗口名,以字符串类型表示
  • img:要显示的图像
python 复制代码
cv.imshow('window2',img)
  • 直接调用该函数会导致显示出现问题,需要结合使用cv.waitKey(),cv.destroyAllWindows()指定绘图停留时间以及释放资源
python 复制代码
cv.imshow('window2',img)
cv.waitKey(0) #给图像绘制留下时间
cv.destroyAllWindows() #释放资源

4.保存图像

  • cv2.imwrite(path,img)
  • 将图片保存到指定路径
python 复制代码
cv.imwrite('gray.png',img2)

5.创建黑白图像

  • 由于OpenCV使用Numpy数组对图像进行存储,因此我们可以使用Numpy来创建对应的图像数组
python 复制代码
import cv2 as cv
import numpy as np
h = 480
w = 480
img = np.zeros((h,w,3),dtype=uint8)
cv.imshow('img',img)
img[:,:,:] = 255
cv.imshow('img1',img)
cv.waitKey(0)
cv2.destroyAllWindows()
  • 以下展示生成随机颜色的图像
python 复制代码
h = 480
w = 480
img = np.zeros((h,w,3),dtype=uint8)
img[:,:,:] = np.random.randint(0,256,(h,w,3)) 
cv.imshow('random',random_img) 
cv.waitKey(0) 
cv.destroyAllWindows()

6.图像切片

  • 对图像进行切片相当于对图像对应的Numpy数组进行切片
python 复制代码
img = cv.imread('cat1.png')
print(img.shape)

y = 70
x = 100
w = 250
h = 250
img1 = img[y:y+w,x:x+h]
cv.imshow('img1',img1)
cv.imshow('img2',img)
cv.waitKey(0)
cv.destroyAllWindows()

tips:需要注意的是,OpenCV里的坐标系和数学中的直角坐标系有区别;h对应的是垂直方向,w对应的是水平方向

7.图像大小调整

  • cv2.resize(img,dsize,dts)
  • 结果返回一个新的图像数组
python 复制代码
img = cv.imread('cat1.png')

new_img = cv.resize(img,(480,100))
cv.imshow('img',new_img)
cv.waitKey(0)
cv.destroyAllWindows()

四、读取视频

  • 视频是由一帧一帧的图片组合而成,读取视频本质上也是在读取图片
  • cap = cv2.VideoCapture(path)
  • ret,frame = cap.read()
  • 首先创建VideoCapture类的对象,再使用该对象调用read方法读取视频
  • 返回值ret是一个布尔值,用于判断是否读取成功;frame代表一帧图像
python 复制代码
cap = cv.VideoCapture(r'D:\AI\code\OpenCV\20221112_09:42:12_1.mp4') #本地读取视频
cap1 = cv.VideoCapture(0) #从摄像头读取视频流
while True:
    ret,frame = cap.read()
    if not ret:
        print("读取结束")
        break
    cv.imshow('frame',frame)
    # 等待40毫秒并检查按键事件,获取按键的ASCII码,判断按键是否为q键
    if cv.waitKey(40) & 0xFF==ord('q'):
        break
cap.release()
cv.destroyAllWindows()

THE END

相关推荐
轻闲一号机3 分钟前
【机器学习】机器学习笔记
人工智能·笔记·机器学习
天下琴川37 分钟前
Dify智能体平台源码二次开发笔记(5) - 多租户的SAAS版实现(2)
人工智能·笔记
jndingxin1 小时前
OpenCV 图形API(31)图像滤波-----3x3 腐蚀操作函数erode3x3()
人工智能·opencv·计算机视觉
小臭希1 小时前
python蓝桥杯备赛常用算法模板
开发语言·python·蓝桥杯
mosaicwang1 小时前
dnf install openssl失败的原因和解决办法
linux·运维·开发语言·python
蹦蹦跳跳真可爱5892 小时前
Python----机器学习(基于PyTorch的乳腺癌逻辑回归)
人工智能·pytorch·python·分类·逻辑回归·学习方法
Bruce_Liuxiaowei2 小时前
基于Flask的Windows事件ID查询系统开发实践
windows·python·flask
YOULANSHENGMENG2 小时前
使用opencv+python 实现图像的斜向矫正
opencv·计算机视觉
carpell2 小时前
二叉树实战篇1
python·二叉树·数据结构与算法
qp2 小时前
24.OpenCV中的霍夫直线检测
opencv·计算机视觉