当前位置: 首页 > news >正文

day24 学习笔记

文章目录

  • 前言
  • 一、OpenCV简介
  • 二、计算机中的图像表达
    • 1.图像表示
    • 2.图像存储
  • 三、基本图像操作
    • 1.创建窗口
    • 2.读取图像
    • 3.显示图像
    • 4.保存图像
    • 5.创建黑白图像
    • 6.图像切片
    • 7.图像大小调整
  • 四、读取视频


前言

  • 目前,我开始学习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方法中指定窗口名从而省略该步骤
cv.namedWindow('window1',cv.WINDOW_AUTOSIZE) #cv.WINDOW_AUTOSIZE表示不能调整窗口大小
cv.namedWindow('window2',cv.WINDOW_NORMAL) #cv.WINDOW_NORMAL表示可调整窗口

2.读取图像

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

3.显示图像

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

4.保存图像

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

5.创建黑白图像

  • 由于OpenCV使用Numpy数组对图像进行存储,因此我们可以使用Numpy来创建对应的图像数组
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()
  • 以下展示生成随机颜色的图像
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数组进行切片
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)
  • 结果返回一个新的图像数组
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代表一帧图像
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

相关文章:

  • Linux:35.其他IPC和IPC原理+信号量入门
  • 自动驾驶的数据集以及yolov8和yolop
  • Oracle 复制表结构(含索引、主键)操作指南
  • 池式结构---内存池
  • 企业年报问答RAG挑战赛冠军方案:从零到SotA,一战封神
  • AI 大语言模型 (LLM) 平台的整体概览与未来发展
  • #关于数据库中的时间存储
  • 006.Gitlab CICD流水线触发
  • Python实现链接KS3,并批量下载KS3文件数据到本地
  • MySQL数据库备份与恢复详解
  • 21 天 Python 计划:MySQL索引机制从基础到应用
  • 人事招聘专员简历模板
  • 谷歌开源代理开发工具包(Agent Development Kit,ADK):让多智能体应用的构建变得更简
  • 【区分定语从句和同位语从句】
  • 普瑞PS8742B
  • 【JavaScript】对 Proxy 与 defineProperty 的理解和运用场景
  • DeepSeek大语言模型部署指南:从基础认知到本地实现
  • 使用Python从零开始构建端到端文本到图像 Transformer大模型
  • STM32F103复用JTAG/SWD引脚为GPIO
  • 数学建模:针对汽车行驶工况构建思路的延伸应用
  • 大连哪家科技公司做网站好/网站seo搜索引擎优化案例
  • 企业做门户网站的重要性/新乡seo外包
  • asp做网站优点/百度关键词优化大师
  • 学做视频的网站有哪些/产品网络推广的方法
  • 微信推广方案/网站怎样优化seo
  • 深圳外贸商城网站建设/重庆seo排名