vlambda博客
学习文章列表

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



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




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


01





OpenCV 图像处理

上一chapter 我们简单地学会了image,video,camera device 设备的图片获取方法,接下来,我们来了解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)


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

    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)




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

    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)



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

可以看到我们分别创建了一个纯白和纯黑的图片出来,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)



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


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)



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


 

   # 获取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 被单独拉扯了出来,至此,我们离目标图像识别更近了一步




扫码加我

共度难关

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


END