opencv3 computer vision 7.2 car detection

import cv2
import numpy as np
from os.path import join
#此数据集为UIUC Car Detection 百度云链接可下载
datapath = 'D:\\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(120):
	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 = 'car.jpg','2.png'
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)

while (True):
	cv2.imshow('BOW + SVM Success', car_img)
	cv2.imshow('BOW + SVM Failure', notcar_img) 
#按q退出
	if(cv2.waitKey(1000//12) &  0xff == ord("q")):
		break
cv2.destroyAllWindows()
	

SIFT algorithm version problem, need to reinstall opencv-python==3.4.2.16; opencv-contrib-python==3.4.2.16 these two versions

It can be installed online with pip, but the domestic Internet speed is very slow. Baidu Cloud Link comes with these two installation packages and data sets

pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16

Link: https://pan.baidu.com/s/1PjFygGDgXEzmRm7hr4LPjg 
Extraction code: n45t 
 

Guess you like

Origin blog.csdn.net/sinat_38685910/article/details/95511133