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

news/2024/4/23 20:06:34/文章来源:https://blog.csdn.net/qq_44757503/article/details/126391731

考书目《人工智能之机器视觉》–程晨
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'):breakcap.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 cv2img=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 numpyimg=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 numpyimg=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 =faceRectcv2.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 numpyimg=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 = faceRectcv2.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.luyixian.cn/news_show_74365.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java面试题-JVM类加载机制

类加载的生命周期?1. 加载阶段(Loading)在Java程序中,当需要使用某个类时,JVM会使用类加载器来查找并加载该类文件。类加载器会首先从文件系统或网络中查找相应的 .class 文件,读取类的二进制数据&#xff…

链表(一):移除链表元素、设计链表等力扣经典链表题目

203.移除链表元素相关题目链接:力扣 - 移除链表元素题目重现给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。思路链表的删除操作如上图所示,我们需要先找到要删除的…

物联网的新应用--触摸物联网

摘要:本文介绍一下触摸物联网的新进展--电子皮肤的物联网应用。还以为物联网的作用领域单单是从现场采集数据或者传输命令到执行设备吗?不,物联网的应用范围远比控制一盏灯大的多。据网上报道,香港城市大学(城大&#…

响应性基础API

一.什么是proxy和懒代理?什么是proxy?proxy对象是用于定义基本操作的自定义行为(如:属性查找,赋值,枚举,函数调用等等)。什么是懒代理?懒代理:在初始化的时候不会进行全部代理,而是…

简历信息提取论文笔记Information Extraction from Resume Documents in PDF Format

标题:Information Extraction from Resume Documents in PDF Format下载地址:https://library.imaging.org/ei/articles/28/17/art00013长度:8页发表时间:2016引用量cite27先读标题、摘要、结论、然后 methods/experiment design,…

Zebec社区上线ZIP-2(地平线升级行动)提案,海量激励将被释放

此前,Zebec社区在上线了投票治理系统Zebec Node后,曾上线了首个提案ZIP-1,对 Nautilus Chain 的推出进行了投票,作为 Zebec Chain 上线前的“先行链”,该链得到了社区用户的欢迎,投通过票的比例高达98.3%。…

Spring之丐版IOC实现

文章目录IOC控制反转依赖注入Bean的自动装配方式丐版IOC实现BeanDefinition.javaResourceLoader.javaBeanRegister.javaBean和DI的注解BeanFactory.javaApplicationContext测试,实现在这里插入图片描述大家好,我是Leo。Spring核心中依赖注入和IOC容器是非…

Springboot整合 Thymeleaf增删改查一篇就够了

很早之前写过Thymeleaf的文章,所以重新温习一下,非前后端分离,仅仅只是学习 官网: https://www.thymeleaf.org/ SpringBoot可以快速生成Spring应用,简化配置,自动装配,开箱即用。 JavaConfigur…

Python每日一练(20230226)

目录 1. 合并列表中字典字段 ★ 2. 乘积最大子数组 ★★ 3. 加油站 ★★ 附录 贪心算法 一般步骤 使用条件 存在问题 应用实例 1. 合并列表中字典字段 如下两个列表,需要将oldList转化为newList,去掉相同字段的字典,并且去掉的参…

【RockerMQ】002-RockerMQ 基本概念、系统架构

【RockerMQ】002-RockerMQ 基本概念、系统架构 文章目录【RockerMQ】002-RockerMQ 基本概念、系统架构一、基本概念1、消息(Message)2、主题(Topic)3、标签(Tag)4、队列(Queue)5、消…

MySql触发器学习

文章目录1 触发器1.1介绍1.2 创建触发器1.2 删除触发器1.3查看触发器1 触发器 1.1介绍 触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的…

解决前端组件下拉框选择功能失效问题

问题: 页面下拉框选择功能失效 现象: 在下拉框有默认值的情况下,点击下拉框的其他值,发现并没有切换到其他值 但是在下拉框没默认值的情况下,功能就正常 原因 select 已经绑定选项(有默认值) 在…

Java异常架构与异常关键字

Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制。 Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问…

keepalive + nginx 来实现 对于nginx的高可用, 以及如何搭建主备模式

keepalive nginx 来实现 对于nginx的高可用, 以及如何搭建主备模式。 keeplived简介 Keepalived是用纯ANSI/ISO C编写的。该软件围绕一个中央I/O多路复用器进行连接,以提供实时网络设计。 1.1 Keepalived进程被分为3个不同进程 A.一个极简的父进程&#xff0c…

【JavaSE】复习(进阶)

文章目录1.final关键字2.常量3.抽象类3.1概括3.2 抽象方法4. 接口4.1 接口在开发中的作用4.2类型和类型之间的关系4.3抽象类和接口的区别5.包机制和import5.1 包机制5.2 import6.访问控制权限7.Object7.1 toString()7.2 equals()7.3 String类重写了toString和equals8.内部类8.1…

【深度学习】什么是线性回归逻辑回归单层神经元的缺陷

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录逻辑回归&线性回归单层神经元的缺陷单层神经元的缺陷逻辑回归&线性回归 线性回归预测的是一个连续值, 逻辑回归给出的”是”和“否”的回答. 等…

4、算法MATLAB---认识矩阵

认识矩阵1、矩阵定义和基本运算1.1 赋值运算符:1.2 等号运算符:1.3 空矩阵1.4 一行一列矩阵1.5 行矩阵(元素用空格或逗号分隔)1.6 列矩阵(分号表示换行)1.7 m行n列的矩阵:行值用逗号间隔&#x…

如何在Linux中实现进程间通信

致前行路上的人: 要努力,但不要着急,繁花锦簇,硕果累累都需要过程! 目录 1.进程间通信介绍 1.1进程间通信的目的 1.2进程间通信发展 1.3进程间通信分类 1.4进程间通信的本质 2.管道 2.1什么是管道 2.2管道与进程的关系…

轻量级网络模型ShuffleNet V2

在学习ShuffleNet V2内容前需要简单了解卷积神经网络和MobileNet,以及Shuffnet V1的相关内容,大家可以出门左转,去看我之前的几篇博客MobileNet发展脉络(V1-V2-V3),轻量级网络模型ShuffleNet V1🆗&#xff…

Android 高工分享一波性能优化的总结~

随着 Android 开发越来越规范,国内工程师的素质,以及用户对产品的要求也越来越高。这也间接导致我们对研发项目的质量要求到了近乎苛刻的地步,**内存优化、UI 卡顿优化、App 崩溃监控等性能调优也逐渐成了人手必备的技能。**工作之余&#xf…