计算机视觉之从OpenCV到物体识别(二)
前言:上一章节我们学会了图片、视频以及外设获取帧图片的方式,以及OpenCV 的灰度图片处理。计算机不像人眼可以很轻易地辨别物体,本质是将一张图片转换成灰度图,通过一定的模型训练,使得机器能够从0,1(黑与白)中分辨物体的特征,由局部到整体,图片越复杂,所需的训练程度越高。这一章节我们接着上一chapter 来实操,慢慢见证从0到1 的过程。
01
OpenCV 图像处理
import cv2
import numpy as np
img = cv2.imread("resource/lena.jpeg")
kernel = np.ones((5,5),np.uint8)
# 灰度图
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 图片模糊
imgBlur = cv2.GaussianBlur(imgGray,(3,3),0)
# 边缘图片
imgCanny = cv2.Canny(img,150,150)
# 边缘厚度 iterations 迭代次数
imgDialation = cv2.dilate(imgCanny,kernel,iterations=1)
# 图片侵蚀
imgEroded = cv2.erode(imgDialation,kernel,iterations=1)
cv2.imshow("grayImg",imgGray)
cv2.imshow("blurImg",imgBlur)
cv2.imshow("CannyImg",imgCanny)
cv2.imshow("DialationImg",imgDialation)
cv2.imshow("ErodedImg",imgEroded)
kernel = np.ones((5,5),np.uint8)
np.ones(5,5) 表示使用numpy 创建一个5x5 且元素都为“1”的矩阵
iterations 表示迭代次数,iterations 值越大,在边缘厚度以及侵蚀处理时,图片厚度和侵蚀度越高。可以尝试调节iterations 值大小,观察其变化。
02
OpenCV 图片裁剪
import cv2
import numpy as np
# imgResize
teslaImg = cv2.imread("resource/tesla.jpeg")
cv2.imshow("teslaImg",teslaImg)
print(teslaImg.shape) #(480,640,3) 高:480 宽:640 3:频道数:BGR
imgResize = cv2.resize(teslaImg,(300,200))
cv2.imshow("imgResize",imgResize)
print(imgResize.shape) #(200, 300, 3) 高:200 宽:300 3:频道数:BGR
# 获取图像指定部分
imgCropped = teslaImg[0:200,200:500]cv2.imshow("imgCropped",imgCropped)
imgResize = cv2.resize(teslaImg,(300,200))
表示重新指定图片size,(300,200)表示宽高
imgCropped = teslaImg[0:200,200:500]
表示裁剪获取指定区域图片
03
OpenCV 图片绘制
import cv2
import numpy as np
# 图片绘制
# 使用numpy 创建矩阵
imgBlack = np.zeros((500,500,3),np.uint8) # 0表示黑色
imgWhite = np.ones((500,500,3)) # 1表示白色
cv2.imshow("imgBlack",imgBlack)
cv2.imshow("imgWhite",imgWhite)
print('image shape',imgBlack.shape)
可以看到我们分别创建了一个纯白和纯黑的图片出来,console 打印的shape 为 (500,500,3),表示一个500x500,带有GBR 通道 的矩阵。
np.zeros((500,500,3)
np.zeros 表示创建了一个全0,500x500 的矩阵,带有BGR 通道,最终获取了一张纯黑色的图片,同理np.ones表示创建了一个全1,500x500 的矩阵,最终获取了一张纯白色图片。
import cv2
import numpy as np
# 图片绘制
# 使用numpy 创建矩阵
imgBlack = np.zeros((500,500,3),np.uint8) # 0表示黑色
# 给图片上色
imgBlack[:] = 255,0,0 # 蓝色
cv2.imshow("BlueHole",imgBlack)
imgBlack[200:300,100:300] = 255,0,0 # 部分蓝色
cv2.imshow("BluePart",imgBlack)
# 画线
cv2.line(imgBlack,(0,0),(300,300),(0,255,0),3) # 3厚度 GBR ,blue
# imgBlack.shape[1] 高 imgBlack.shape[0] 宽 ,得到对角线
cv2.line(imgBlack,(0,0),(imgBlack.shape[1],imgBlack.shape[0]),(0,255,0),3) # 3厚度 GBR ,blue
# 长方形
cv2.rectangle(imgBlack,(200,0),(400,200),(0,0,255),3)
# 圆
cv2.circle(imgBlack,(100,100),100,(255,255,0),1)
# 放置文本
cv2.putText(imgBlack,"OpenCV",(250,250),cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),5)cv2.imshow("totalImg",imgBlack)
04
OpenCV 获取指定图片中的特定物体
import cv2
import numpy as np
# 提取指定图像
pokerImg = cv2.imread("resource/puke.jpg")
cv2.imshow("pokerWholeImg",pokerImg)
print(pokerImg.shape)
# 获取Joker 四个点坐标
width,height = 150,225
pts1 = np.float32([[405,278],[497,343],[303,418],[399,487]])
# 定义原点,宽高
pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]])
matrix = cv2.getPerspectiveTransform(pts1,pts2)
imgOutPut = cv2.warpPerspective(pokerImg,matrix,(width,height))cv2.imshow("outPutPoker",imgOutPut)
# 获取Joker 四个点坐标
width,height = 150,225
pts1 = np.float32([[405,278],[497,343],[303,418],[399,487]])
# 定义原点,宽高pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]])
pts2 表示生成的图片指定的(x,y,width,height)
我们可以看到目标黑桃J 被单独拉扯了出来,至此,我们离目标图像识别更近了一步。
扫码加我
共度难关
END