人工智能-机器视觉篇搞定(笔记)

news2024/11/25 10:27:19

考书目《人工智能之机器视觉》–程晨
1.从计算机读取一张图片显示

##获取图片
import cv2
im=cv2.imread("im.jpg")
cv2.imshow("my",im)
cv2.waitKey()
cv2.destroyAllWindows()

2.显示视频帧

import cv2
#cap = cv2.VideoCapture("video.mp4")获取video.mp4.的视频
cap = cv2.VideoCapture(0) #0默认电脑内置摄像头
while True:
    ret,frame = cap.read()#read()含有两个返回值
    if ret==True:
        cv2.imshow("cap",frame)
        if cv2.waitKey(0) & 0xFF == ord('q'):
            break
        
cap.release()#释放是摄像头
cv2.destroyAllWindows()#释放opencv打开的所有窗口

3.图像处理引入numpy模块,
(1)计算向量的内积和矩阵使用dot()
x=[1,2,3]
y=[4,5,6]
则numpy.dot(x,y)的结果`

1*4+2*5+3*6=32

4.图像的翻转
图像的翻转函数flip(),两人参数,第一个是要翻转的图片,第二个是图像翻转的模式,0表示垂直翻转(沿着x轴翻转),1表示水平翻转(沿着y轴翻转).另外保存图片函数imwrite(),两个参数,第二个是要保存的图片,第一个参数是新图片的名字

#图片翻转和保存
import cv2

img=cv2.imread("im.jpg")
res= cv2.flip(img,1)#水平翻转
cv2.imshow("ims1.jpg",img)
cv2.imshow("ims.jpg",res)
cv2.imwrite("save.jpg",res)#保存
cv2.waitKey()
cv2.destroyAllWindows()  # 释放opencv打开的所有窗口

5.图像的平移
解释 img.shape[:2]:
img.shape[:2] 取彩色图片的长、宽。
如果img.shape[:3] 则取彩色图片的长、宽、通道。
关于img.shape[0]、[1]、[2]
img.shape[0]:图像的垂直尺寸(高度)
img.shape[1]:图像的水平尺寸(宽度)
img.shape[2]:图像的通道数
在矩阵中,[0]就表示行数,[1]则表示列数

仿射变换,指一个向量空间进行线性变换+平移变成另外一个向量空间,它需要一个变换矩阵,而由于仿射变换较为复杂,一般很难找出这个矩阵,于是opencv提供了cv2.getAffineTransform()
cv2.getAffineTransForm()通过找原图像中三个点的坐标和变换图像的相应三个点坐标,创建一个2X3的矩阵。最后这个矩阵会被传给函数cv2.warpAffine()。代码如下图

#图片平移
import cv2
import numpy

img=cv2.imread("im.jpg")
rows,cols =img.shape[:2] #彩色图片的长、宽,图片像素的行数,列数返回给rows,cols
p1=numpy.float32([[0,0],[cols-1,0],[0,rows-1]])
p2=numpy.float32([[25,40],[cols-1+25,40],[25,rows-1+40]])
M= cv2.getAffineTransform(p1,p2)#自动求解M的函数
res = cv2.warpAffine(img,M,(cols,rows))# 仿射变换

cv2.imshow("origin.jpg",img)
cv2.imshow("new",res)
cv2.imwrite("save.jpg",res)#保存
cv2.waitKey()
cv2.destroyAllWindows()  # 释放opencv打开的所有窗口


	仿射变换,指一个向量空间进行线性变换+平移
	变成另外一个向量空间,它需要一个变换矩阵,而由于仿射变换较为复杂,
	一般很难找出这个矩阵,
	于是opencv提供了cv2.getAffineTransform(),
	cv2.getAffineTransForm()通过找原图像中三个点
	的坐标和变换图像的相应三个点坐标,创建一个2X3的矩阵。
	最后这个矩阵会被传给函数cv2.warpAffine()

在这里插入图片描述
opencv提供了一个根据旋转角度和旋转中心的自动求解M矩阵函数-getRotationMatrix2D()

6.图片的缩放

#图片缩放
import cv2
import numpy
img=cv2.imread("im.jpg")
res = cv2.resize(img,(300,300)) #缩放

cv2.imshow("origin.jpg",img)
cv2.imshow("new",res)
cv2.imwrite("save.jpg",res)#保存
cv2.waitKey()
cv2.destroyAllWindows()  # 释放opencv打开的所有窗口

7.计算机视觉有三种常用的色彩空间,灰度,BGR和HSV,灰度通过去除彩色信息来转换为灰阶,灰阶彩色空间对中间处理特别好,如人脸检测就是需要灰度转换。
要将BGR图片转换为HSV使用的函数是cvtColor()函数。参数1是转换的函数,参数2是转换的形式。cvtColor()函数能够转换为任何色彩空间,只需要修改第二个参数。
在这里插入图片描述
7.卷积运算
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
OpenCV用filter2D()函数是实现卷积操作,

#进行垂直边缘提取
kernel= numpy.array([[矩阵]])
edge_v =cv2.fliter2D(img,kernel)
#进行水平边缘提取
edge_v =cv2.fliter2D(img,kernel.T)#kernel.T表示kernel的转置

8.滤波器
线性滤波方式有均值滤波blur()函数和高斯滤波Gaussian Blur()函数
在这里插入图片描述
(1)均值blur()
555白送在这里插入图片描述
(5,5)表示卷积核的大小,越大图片越模糊
(2)高斯滤波Gaussian Blur

9.Canny 边缘检测
Canny比较简单的边缘检测函数,例子:
在这里插入图片描述
效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
10.人脸检测
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用OpenCV人脸检测通过CascadeClassifier()函数加载Haar分类器,该函数的参数就是对于训练好的xml文件,代码:

classfier=cv2.CascadeClassifier("harrcascade_frontalface_default.xml"(xml放到工程目录下)

程序:detectMultiScale()进行人脸识别

#人脸检测
import cv2
import numpy

img=cv2.imread("im.jpg")
grey= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
classfier=cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
faceRects =classfier.detectMultiScale(grey,scaleFactor=1.1,minNeighbors=3,minSize=(32,32))

for faceRect in faceRects:
    x,y,w,h =faceRect
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
cv2.imshow("origin.jpg",img)
cv2.waitKey()
cv2.destroyAllWindows()  # 释放opencv打开的所有窗口

解释:
介绍
检测到人脸了,还可以在人脸范围内检测眼睛

#检测眼睛
import cv2
import numpy

img=cv2.imread("im.jpg")
grey= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
classfier=cv2.CascadeClassifier("haarcascade_eye.xml")
faceRects =classfier.detectMultiScale(grey,scaleFactor=1.1,minNeighbors=3,minSize=(32,32))

for faceRect in faceRects:
    x,y,w,h = faceRect
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
    #人脸识别区域
    face_img = grey[y:y+h,x:w+x]
    eyes = classfier.detectMultiScale(face_img,scaleFactor=1.1,minNeighbors=6,minSize=(30,30))
    for ex, ey, ew, eh in eyes:
        cv2.rectangle(img, (x+ex,y+ey),(x+ex+ew,y+ey+eh),(0, 255, 0), 2)
cv2.imshow("origin.jpg",img)
cv2.waitKey()
cv2.destroyAllWindows()  # 释放opencv打开的所有窗口

视频中的人脸识别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

shell脚本入门

实习的时候第一个月的考核就是如何部署一个云资源,当时走的捷径(杠杠的搜索能力hhhh)找到了一个shell脚本一键部署,后来被leader问起来就如实说了,leader问有没有看懂shell脚本中的逻辑……(没有&#xff0…

代码随想录第四十二天| ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

01背包问题 模型详解 描述 在一个容量有限的 背包里装若干物品,这些物品重量不同,价值不同。如何装使这些背包内物品价值最大。 (1)如果物品可以分割,直接用贪心算法,首先装价值密度最大的物品 &#xff…

acwing3485最大异或和(trie树,贪心)

给定一个非负整数数列 a,初始长度为 N。 请在所有长度不超过 M 的连续子数组中,找出子数组异或和的最大值。 子数组的异或和即为子数组中所有元素按位异或得到的结果。 注意:子数组可以为空。 输入格式 第一行包含两个整数 N,M。 第二行…

【数字IC基础】黑盒验证、白盒验证、 灰盒验证

文章目录 一、黑盒验证二、白盒验证三、灰盒验证一、黑盒验证 1、黑盒验证:大多数基于仿真的验证环境都是黑盒验证;2、不需要知道设计的内部结构和特性,只需要在输入端口打激励,观察输出即可;3、验证工程师学习设计的规格,然后编写验证环境中的 drivers, monitors, check…

如何提高机器人专业课讲师的收入

先放一些总结:为什么我是不合格的高校机器人工程专业讲师?2020不合格肯定收入不会提升,甚至失业风险会非常高的。为何所做的课程努力几乎全部失败呢?→机器人工程类← 2022不能一次次失败,因为只有自己会为失败买单&am…

【经典蓝牙】蓝牙 A2DP协议分析

A2DP 介绍 A2DP(Advanced Audio Distribution Profile)是蓝牙高音质音频传输协议, 用于传输单声道, 双声道音乐(一般在 A2DP 中用于 stereo 双声道) , 典型应用为蓝牙耳机。 A2DP旨在通过蓝牙连接传输高质量的立体声音…

【教程】Notion笔记多平台设置中文显示

这个笔记软件界面挺好看,惊艳到了。 目录 网页版 桌面端 Windows版 Mac端 安卓端 网页版 直接安装这个插件即可,Chrome/Edge适用:Notion中文版 桌面端 都要去这个github下载语言包,用于替换文件:https://github.c…

智能家居项目(五)测试串口功能

目录 一、写一个单独测试串口的demo 二、直接运行上一篇智能家居的代码 一、写一个单独测试串口的demo 1、TTL串口与树莓派的连接方式 (1)TTL的RXD和TXD针脚连接到树莓的TXD和RXD上(T–>R R–>T),交叉连&…

ChatGPT是如何训练得到的?通俗讲解

首先声明喔,我是没有任何人工智能基础的小白,不会涉及算法和底层原理。 我依照我自己的简易理解,总结出了ChatGPT是怎么训练得到的,非计算机专业的同学也应该能看懂。看完后训练自己的min-ChatGPT应该没问题 希望大牛如果看到这…

ACSC 2023 比赛复现

Admin Dashboard 在 index.php 中可以看到需要访问者是 admin 权限,才可以看到 flag。 report.php 中可以让 admin bot 访问我们输入的 url,那么也就是说可以访问 addadmin.php 添加用户。 在 addadmin.php 中可以添加 admin 用户,但是需…

git的使用(终端输入指令)下

文章目录前言1、git 分支创建分支查看分支切换分支合并分支删除分支2.提交到远程仓库远程提交链接一下自己仓库总结前言 上章链接 :git的使用(终端输入指令)上 我们接着上着来说 上章把 git 的 功能实现了一部分,本章我们接着上文…

Hive入门学习

文章目录1.概述1.1 hive与hadoop的关系1.2 映射信息记录1.3 hive架构图Hive组件2.Hive数据模型2.1 Table2.2 Partition2.3 Buckets3.元数据相关名词3.1 Metadata3.2 Metastore3.3 metastore三种配置方式3.3.1 内嵌模式3.3.2 本地模式3.3.3 远程模式1.概述 Apach hive 是一款建…

并发编程-学习总结(上)

目录 1、线程基础 1.1、线程实现方法 1.2、如何正确停止线程 1.3、Java线程的六种状态 1.4、wait/notify/notifyAll注意事项 1.4.1、为什么 wait 、notify、notifyAll必须在 synchronized 保护的同步代码中使用? 1.4.2、为什么 wait/notify/notifyAll 被定义…

浅谈QWebChannel、QWebChannelAbstractTransport、QWebSocketServer、QWebSocket用法及之间关系

1.前言在现实业务中,经常遇到这样的需求:一端采用web形式开发的,如:客户端采用html、javascript、nodejs开发;而另一端采用C开发,如:Qt开发的服务端。web页面端需和Qt开发的服务端进行通信、数据…

深入理解java虚拟机精华总结:如何判断对象是否可回收、引用、finalize、方法区回收、垃圾收集算法、垃圾收集器、内存分配与回收策略

深入理解java虚拟机精华总结:如何判断对象是否可回收、引用、finalize、方法区回收、垃圾收集算法、垃圾收集器、内存分配与回收策略如何判断对象是否可回收引用计数可达性分析法引用finalize方法区回收垃圾收集算法标记-清除算法标记-复制算法标记-整理算法垃圾收集…

141周期acwing(kmp)

一个字符串的前缀是从第一个字符开始的连续若干个字符,例如 abaab 共有 5 个前缀,分别是 a,ab,aba,abaa,abaab。 我们希望知道一个 N 位字符串 S 的前缀是否具有循环节。 换言之,对于每一个从…

_vue-1

谈谈你对MVVM的理解 为什么要有这些模式,目的:职责划分、分层(将Model层、View层进行分类)借鉴后端思想,对于前端而已,就是如何将数据同步到页面上 MVC模式 代表:Backbone underscore jquer…

Docker buildx 的跨平台编译

docker buildx 默认的 docker build 命令无法完成跨平台构建任务,我们需要为 docker 命令行安装 buildx 插件扩展其功能。buildx 能够使用由 Moby BuildKit 提供的构建镜像额外特性,它能够创建多个 builder 实例,在多个节点并行地执行构建任…

YOLOv5模型学习记录

新年伊始,YOLOv8横空出世,这个还未开源时便引发界内广泛热议的目标检测算法,一经问世便再次引发热潮,而作为与其师出同源的YOLOv5,自然要拿来与其比较一番。接下来我们便来学习一下吧。 模型结构 首先便是模型结构了…

Lambda原理及应用

Lambda原理及应用 Lambda介绍 Lambda 是 JDK8 以后版本推出的一个新特性,也是一个重要的版本更新,利用 Lambda 可以简化内部类,可以更方便的进行集合的运算,让你的代码看起来更加简洁,也能提升代码的运行效率。 Lambda语法 非…