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

考书目《人工智能之机器视觉》--程晨

##获取图片
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(),两个参数,第二个是要保存的图片,第一个参数是新图片的名字

#图片翻转和保存;

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()

(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打开的所有窗口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值