opencv計算機視覺學習筆記六

 

第七章 目標檢測與識別html

梯度直方圖histogram of oriented gradientpython

圖像金字塔 image pyramidc++

滑動窗口 sliding window算法

 

1 目標檢測與識別app

 

A HOG描述符ide

每一個單元包含八個直方圖即八個方向(n,nw,w,sw,s,se,e,ne)測試

尺度  檢測目標可能位於較大圖像中字體

位置  檢測圖像可能位於圖像的任意位置優化

能夠使用圖像金字塔或是滑動窗口解決ui

非最大抑制

支持向量機

Svm算法,對於帶有標籤的訓練數據,經過一個優化的超平面對這些數據進行分類

 

 

B  檢測人

示例代碼以下;

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2016/12/12 11:34
# @Author  : Retacn
# @Site    : 檢測人
# @File    : hogdescriptor.py
# @Software: PyCharm
__author__ = "retacn"
__copyright__ = "property of mankind."
__license__ = "CN"
__version__ = "0.0.1"
__maintainer__ = "retacn"
__email__ = "zhenhuayue@sina.com"
__status__ = "Development"

import cv2
import numpy as np


# 檢測某個矩形是否包含另外一個矩形
def is_inside(o, i):
    ox, oy, ow, oh = o
    ix, iy, iw, ih = i
    return ox > ix and oy > iy and ox + ow < ix + iw and oy + oh < iy + ih


# 繪製矩形框住檢測到的人
def draw_person(imgae, person):
    x, y, w, h = person
    cv2.rectangle(imgae, (x, y), (x + w, y + h), (0, 255, 255), 2)


# 讀入圖像
img = cv2.imread('../people.jpg')
# 建立檢測器
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

found, w = hog.detectMultiScale(img)

found_filtered = []
for ri, r in enumerate(found):
    for qi, q in enumerate(found):
        if ri != qi and is_inside(r, q):
            break         else:
            found_filtered.append(r)
for person in found_filtered:
    draw_person(img, person)

# 顯示圖像
cv2.imshow('people detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

C 建立和訓練檢測器

對於檢測不一樣對像,如何創建分類器

使用svm和詞袋(bag-of-word) bow在語言分析中的應用

示列以下:

I like opencv and i like python

I like c++ and python

I don’t like artichokes

 

能夠用如下值來創建字典

{

I:4,

Like:4,

Opencv:2,

And:2

Python:2

C++:1

Don’t:1

Artichokes:1

}

 

以上的三句話能夠用如下向量表示:

[2,2,1,1,1,0,0,0]

[1,1,0,1,1,1,0,0]

[1,1,0,0,0,0,1,1]

 

計算機視覺中的bow

取樣本數據集

對數據集中的每幅圖像提取描述符(sif,surf)

將每一個描述符添加到bow訓練器中

將描述符聚類開k族中(聚類的中心就是視覺單詞)

 

K-means聚類  用於數據分析的向量化方法

 

2 汽車檢測

數據集下載

The university orlllinois

http://l2r.cs.uiuc.edu/~cogcomp/DATA/Car/CarData.tar.gz

 

Stanforduniversity

Http://ai.stanford.edu/~jkrause/cars/car_dataset.html

 

示例代碼以下:


import cv2
import numpy as np
from os.path import join

# TODO  定義路徑 datapath = 'E:/notes/python/opencv_python/openLib/CarData/TrainImages'


# 取得測試圖像的完整路徑
def path(cls, i):
    return '%s/%s%d.pgm' % (datapath, cls, i + 1)


pos, neg = 'pos-', 'neg-'

# 使用sif,surf 提取特徵描述符
detect = cv2.xfeatures2d.SIFT_create()  # 提取關鍵點
extract = cv2.xfeatures2d.SURF_create()  # 提取特徵

# 使用flann匹配器
flann_params = dict(algorithm=1, trees=5)
matcher = cv2.FlannBasedMatcher(flann_params, {})

# 建立bow訓練器,簇數爲40
bow_kmeans_trainer = cv2.BOWKMeansTrainer(40)
# 初始化bow提取器
extract_bow = cv2.BOWImgDescriptorExtractor(extract, matcher)


# 取得圖像路徑,認灰度格式讀取圖像,返回描述符
def extract_sift(fn):
    im = cv2.imread(fn, 0)
    return extract.compute(im, detect.detect(im))[1]


# 每一個類讀取8張圖像
for i in range(8):
    bow_kmeans_trainer.add(extract_sift(path(pos, i)))
    bow_kmeans_trainer.add(extract_sift(path(neg, i)))

# 執行k-means分類並返回詞彙
voc = bow_kmeans_trainer.cluster()
extract_bow.setVocabulary(voc)


# 取得基於bow描述符提取器計算獲得的描述符
def bow_features(fn):
    im = cv2.imread(fn, cv2.IMREAD_GRAYSCALE)
    return extract_bow.compute(im, detect.detect(im))


# 訓練數據和標籤
traindata, trainlables = [], []
# 生成正負樣本圖像的標籤
for i in range(20):
    # extend尾部添加
    traindata.extend(bow_features(path(pos, i)));
    trainlables.append(1)
    traindata.extend(bow_features(path(neg, i)));
    trainlables.append(-1)

# 建立svm實例
svm = cv2.ml.SVM_create()
# 訓練數據和標籤
svm.train(np.array(traindata), cv2.ml.ROW_SAMPLE, np.array(trainlables))


# 顯示predict結果
def predict(fn):
    f = bow_features(fn)
    p = svm.predict(f)
    print(fn, '\t', p[1][0][0])
    return p


# TODO  設置兩個樣本圖像的路徑 car, notcar = '../car.jpg', '../book.jpg'
car_img = cv2.imread(car)
notcar_img = cv2.imread(notcar)

# 將圖像傳給svm,取得檢測結果
car_predict = predict(car)
notcar_predict = predict(notcar)

# 設置字體樣式
font = cv2.FONT_HERSHEY_SIMPLEX

# 在圖片上顯示信息說明
if (car_predict[1][0][0] == 1.0):
    cv2.putText(car_img, "Car Detected", (10, 30), font, 1, (0, 255, 0), 2, cv2.LINE_AA)

if (notcar_predict[1][0][0] == -1.0):
    cv2.putText(notcar_img, "Car Not Detected", (10, 30), font, 1, (0, 0, 255), 2, cv2.LINE_AA)

# 顯示圖像
cv2.imshow('BOW+SVM Success', car_img)
cv2.imshow('BOW+SVM Failure', notcar_img)
if cv2.waitKey(0) & 0xFF == ord('q'):
    cv2.destroyAllWindows()

 

 

運行結果以下圖:

 

Svm滑動窗口

檢測同一物體的多個目標

肯定檢測到的目標在圖像中的位置

 

滑動窗口的方法,有點像lcd屏的顯示

示例代碼以下:(測試不成功)

相關文章
相關標籤/搜索