opencv Python 汽车检测

   本代码实现环境为opencv3.2.0,Python2.7,实现功能是汽车检测,主要用到SVM和BOW构建分类器。

   BOW又名词袋,最开始出现是用来解决文档分类,在一系列文档中计算每个词出现的次数,用这些词构成的向量重新表示文档。在计算机视觉中可以用来目标检测:

    (1)需要一个类似于字典的数据集,数据集可以通过网络下载,本文中用的数据集是UIUC Car Detection,里面包含500 张图片。

    (2)通过SIFT或者SUFR等方法对数据集中的每幅图片提取描述符,并将描述符添加到BOW训练器中。

    (3)执行K-means分类,并返回词汇

    (4)创建数组,保存训练数据和标签

    (5)创建SVM,并将训练数据和标签放进SVM进行训练

     ————————至此,准备工作全部完成—————————

     (6)预测图片


import cv2
import numpy as np
from os.path import join
#此数据集为UIUC Car Detection 可网上下载
datapath = "/home/d3athmast3r/dev/python/CarData/TrainImages/"
def path(cls,i):
  return "%s/%s%d.pgm"  % (datapath,cls,i+1)

pos, neg = "pos-", "neg-"#数据集中图片命名方式

detect = cv2.xfeatures2d.SIFT_create()#提取关键点
extract = cv2.xfeatures2d.SIFT_create()#提取特征
#FLANN匹配器有两个参数:indexParams和searchParams,以字典的形式进行参数传参
flann_params = dict(algorithm = 1, trees = 5)#1为FLANN_INDEX_KDTREE
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个正样本和8个负样本
for i in range(8):
  bow_kmeans_trainer.add(extract_sift(path(pos,i)))
  bow_kmeans_trainer.add(extract_sift(path(neg,i)))
#利用训练器的cluster()函数,执行k-means分类并返回词汇
#k-means:属于聚类算法,所谓的聚类算法属于无监督学习,将样本x潜在所属类别Y找出来,具体稍后写一篇补上
voc = bow_kmeans_trainer.cluster()
extract_bow.setVocabulary( voc )

def bow_features(fn):
  im = cv2.imread(fn,0)
  return extract_bow.compute(im, detect.detect(im))
#两个数组,分别为训练数据和标签,并用bow提取器产生的描述符填充
traindata, trainlabels = [],[]
for i in range(20): 
  traindata.extend(bow_features(path(pos, i))); trainlabels.append(1)#1为正匹配
  traindata.extend(bow_features(path(neg, i))); trainlabels.append(-1)#-1为负匹配
#创建SVM实例,将训练数据和标签放到numpy数组中进行训练,有关SVM知识稍后写一篇补上
svm = cv2.ml.SVM_create()
svm.train(np.array(traindata), cv2.ml.ROW_SAMPLE, np.array(trainlabels))

def predict(fn):
  f = bow_features(fn);  
  p = svm.predict(f)
  print fn, "\t", p[1][0][0]
  return p
#预测结果 
car, notcar = "/home/d3athmast3r/dev/python/study/images/car.jpg", "/home/d3athmast3r/dev/python/study/images/bb.jpg"
car_img = cv2.imread(car)
notcar_img = cv2.imread(notcar)
car_predict = predict(car)
not_car_predict = predict(notcar)
#添加文字说明
font = cv2.FONT_HERSHEY_SIMPLEX

if (car_predict[1][0][0] == 1.0):#predict结果为1.0表示能检测到汽车
  cv2.putText(car_img,'Car Detected',(10,30), font, 1,(0,255,0),2,cv2.LINE_AA)

if (not_car_predict[1][0][0] == -1.0):#predict结果为-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)
cv2.waitKey(0)
cv2.destroyAllWindows()

此源代码为opencv3计算机视觉python语言实现中代码

    原文作者:不不不哭
    原文地址: https://blog.csdn.net/u010757125/article/details/78919262
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞