当前位置 博文首页 > 文章内容

    Leo的博客:Python-OpenCV 处理图像(六):对象识别

    作者:21344 栏目:未分类 时间:2021-11-25 22:33:48

    0x00. 特征识别

    这里主要用到两个函数:

    GoodFeaturesToTrack 和 extractSURF

    • GoodFeaturesToTrack: 在图像中寻找具有大特征值的角点。

    • SURF算法: 是一个稳健的图像识别和描述算法。

    总之这俩个我目前也不清楚能用来干嘛,以后用到了在更新吧。

    import cv2.cv as cv
    import math
    
    im = cv.LoadImage("img/church.png", cv.CV_LOAD_IMAGE_GRAYSCALE)
    im2 = cv.CloneImage(im)
    
    # Goodfeatureto track algorithm
    eigImage = cv.CreateMat(im.height, im.width, cv.IPL_DEPTH_32F)
    tempImage = cv.CloneMat(eigImage)
    cornerCount = 500
    quality = 0.01
    minDistance = 10
    
    corners = cv.GoodFeaturesToTrack(im, eigImage, tempImage, cornerCount, quality, minDistance)
    
    radius = 3
    thickness = 2
    
    for (x,y) in corners:
        cv.Circle(im, (int(x),int(y)), radius, (255,255,255), thickness)
    
    cv.ShowImage("GoodfeaturesToTrack", im)
    
    #SURF algorithm
    hessthresh = 1500 # 400 500
    dsize = 0 # 1
    layers = 1 # 3 10
    
    keypoints, descriptors = cv.ExtractSURF(im2, None, cv.CreateMemStorage(), (dsize, hessthresh, 3, layers))
    for ((x, y), laplacian, size, dir, hessian) in keypoints:
        cv.Circle(im2, (int(x),int(y)), cv.Round(size/2), (255,255,255), 1)
        x2 = x+((size/2)*math.cos(dir))
        y2 = y+((size/2)*math.sin(dir))
        cv.Line(im2, (int(x),int(y)), (int(x2),int(y2)), (255,255,255), 1)
    
    cv.ShowImage("SURF ", im2)
    
    cv.WaitKey(0)

    0x01. 人脸识别

    可以使用 OpenCV 训练好的级联分类器来识别图像中的人脸,当然还有很多其他的分类器:例如表情识别,鼻子等,具体可在这里下载:

    OpenCV分类器

    具体使用代码:

    #import library - MUST use cv2 if using opencv_traincascade
    import cv2
    
    # rectangle color and stroke
    color = (0,0,255)       # reverse of RGB (B,G,R) - weird
    strokeWeight = 1        # thickness of outline
    
    # set window name
    windowName = "Object Detection"
    
    # load an image to search for faces
    img = cv2.imread("mao.jpg")
    
    # load detection file (various files for different views and uses)
    cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
    
    # preprocessing, as suggested by: http://www.bytefish.de/wiki/opencv/object_detection
    # img_copy = cv2.resize(img, (img.shape[1]/2, img.shape[0]/2))
    # gray = cv2.cvtColor(img_copy, cv2.COLOR_BGR2GRAY)
    # gray = cv2.equalizeHist(gray)
    
    # detect objects, return as list
    rects = cascade.detectMultiScale(img)
    
    # display until escape key is hit
    while True:
    
        # get a list of rectangles
        for x,y, width,height in rects:
            cv2.rectangle(img, (x,y), (x+width, y+height), color, strokeWeight)
    
        # display!
        cv2.imshow(windowName, img)
    
        # escape key (ASCII 27) closes window
        if cv2.waitKey(20) == 27:
            break
    
    # if esc key is hit, quit!
    exit()

    效果:

    cs