计算机视觉物体识别的过程,计算机视觉之从OpenCV到物体识别(二)

前言:上一章节我们学会了图片、视频以及外设获取帧图片的方式,以及OpenCV 的灰度图片处理。计算机不像人眼可以很轻易地辨别物体,本质是将一张图片转换成灰度图,通过一定的模型训练,使得机器能够从0,1(黑与白)中分辨物体的特征,由局部到整体,图片越复杂,所需的训练程度越高。这一章节我们接着上一chapter 来实操,慢慢见证从0到1 的过程。

e356b47cae9bc27b8711b21d0c20638d.png

01

OpenCV 图像处理

上一chapter 我们简单地学会了image,video,camera device 设备的图片获取方法,接下来,我们来了解openCV 能够在图片上可以干的事情。

importcv2

importnumpy asnp

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)

计算机视觉物体识别的过程,计算机视觉之从OpenCV到物体识别(二)_第1张图片

kernel = np.ones((5,5),np.uint8)

np.ones(5,5) 表示使用numpy 创建一个5x5 且元素都为“1”的矩阵

iterations 表示迭代次数,iterations 值越大,在边缘厚度以及侵蚀处理时,图片厚度和侵蚀度越高。可以尝试调节iterations 值大小,观察其变化。

02

OpenCV 图片裁剪

importcv2importnumpy asnp

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

计算机视觉物体识别的过程,计算机视觉之从OpenCV到物体识别(二)_第2张图片

imgResize = cv2.resize(teslaImg,(300,200))

表示重新指定图片size,(300,200)表示宽高

imgCropped = teslaImg[0:200,200:500]

表示裁剪获取指定区域图片

03

OpenCV 图片绘制

importcv2importnumpy asnp

# 图片绘制

# 使用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)

计算机视觉物体识别的过程,计算机视觉之从OpenCV到物体识别(二)_第3张图片

可以看到我们分别创建了一个纯白和纯黑的图片出来,console 打印的shape 为 (500,500,3),表示一个500x500,带有GBR 通道 的矩阵。

np.zeros((500,500,3)

np.zeros 表示创建了一个全0,500x500 的矩阵,带有BGR 通道,最终获取了一张纯黑色的图片,同理np.ones表示创建了一个全1,500x500 的矩阵,最终获取了一张纯白色图片。

importcv2

importnumpyasnp

# 图片绘制

# 使用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)

计算机视觉物体识别的过程,计算机视觉之从OpenCV到物体识别(二)_第4张图片

04

OpenCV 获取指定图片中的特定物体

importcv2importnumpy asnp

# 提取指定图像    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)

计算机视觉物体识别的过程,计算机视觉之从OpenCV到物体识别(二)_第5张图片

# 获取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

你可能感兴趣的:(计算机视觉物体识别的过程)