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

考书目《人工智能之机器视觉》–程晨
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()

人工智能-机器视觉篇搞定(笔记)_第1张图片
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()函数能够转换为任何色彩空间,只需要修改第二个参数。
人工智能-机器视觉篇搞定(笔记)_第2张图片
7.卷积运算
人工智能-机器视觉篇搞定(笔记)_第3张图片
人工智能-机器视觉篇搞定(笔记)_第4张图片
人工智能-机器视觉篇搞定(笔记)_第5张图片
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()函数
人工智能-机器视觉篇搞定(笔记)_第6张图片
(1)均值blur()
人工智能-机器视觉篇搞定(笔记)_第7张图片
(5,5)表示卷积核的大小,越大图片越模糊
(2)高斯滤波Gaussian Blur

9.Canny 边缘检测
Canny比较简单的边缘检测函数,例子:
人工智能-机器视觉篇搞定(笔记)_第8张图片
效果:
人工智能-机器视觉篇搞定(笔记)_第9张图片
人工智能-机器视觉篇搞定(笔记)_第10张图片
人工智能-机器视觉篇搞定(笔记)_第11张图片
10.人脸检测
人工智能-机器视觉篇搞定(笔记)_第12张图片
人工智能-机器视觉篇搞定(笔记)_第13张图片
人工智能-机器视觉篇搞定(笔记)_第14张图片
使用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打开的所有窗口

解释:
人工智能-机器视觉篇搞定(笔记)_第15张图片
检测到人脸了,还可以在人脸范围内检测眼睛

#检测眼睛
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打开的所有窗口

视频中的人脸识别

你可能感兴趣的:(python,人工智能,opencv,计算机视觉)