使用python+opecncv实现目标检测
以下是需要用到的函数,请读者在阅读代码时先行了解:
sift算法:此算法用于获取关键点和秒数符
flann匹配:用于匹配不同的描述符
词袋:bow
支持向量机:svm
import cv2 as cv
import numpy as np
def path(cls, i):
return "%s%s%d.jpg" % (datapath, cls, i)
def extract_Sift(fn):
image = cv.imread(fn, 0)
return extract.compute(image, detect.detect(image))[1]
def bow_xfeatures(fn):
image = cv.imread(fn, 0)
return bow_extract.compute(image, detect.detect(image))
def svm_predict(fn):
f = bow_xfeatures(fn)
p = svm.predict(f)
return p
datapath = "/home//feng/carimages/"
pos, neg = "pos-", "neg-" #全部的汽车照片都是有pos-x.jpg组成的,非汽车图片都是有neg-x.jpg组成的。
detect = cv.xfeatures2d.SIFT_create() #创建sift算法
extract = cv.xfeatures2d.SIFT_create()
indexpara = dict(algorithm=1, trees=5)
checkpara = dict(checks=50)
flann = cv.FlannBasedMatcher(indexpara, checkpara)
bow_trainer = cv.BOWKMeansTrainer(40) #定义一个40个族的词袋
bow_extract = cv.BOWImgDescriptorExtractor(extract, flann)#sift用来提取特征,flann用来匹配描述符
for i in range(1, 9):
bow_trainer.add(extract_Sift(path(pos, i)))
bow_trainer.add(extract_Sift(path(neg, i)))
voc = bow_trainer.cluster() #voc即是词袋的初始“词典”
bow_extract.setVocabulary(voc)
traindata, trainlabels = [], []
for i in range(1, 21):
traindata.extend(bow_xfeatures(path(pos, i)))#为不同的训练数据定义不同标签
trainlabels.append(1)
traindata.extend(bow_xfeatures(path(neg, i)))
trainlabels.append(-1)
svm = cv.ml.SVM_create() #创建支持向量机并用词袋提取出来的描述符去训练支持向量机
svm.train(np.array(traindata), cv.ml.ROW_SAMPLE, np.array(trainlabels))
car = "/home/feng/carimages/carimage.jpeg"
notcar = "/home/feng/carimages/notcarimage.jpg"
carimage = cv.imread(car)
notcarimage = cv.imread(notcar)
car_predict = svm_predict(car)
notcar_predict = svm_predict(notcar)
if car_predict[1][0][0] == 1.0:
cv.putText(carimage, "car_detected", (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 1, cv.LINE_AA)
if notcar_predict[1][0][0] == -1.0:
cv.putText(notcarimage, 'car_not_detecte', (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 1, cv.LINE_AA)
cv.imshow("car_Detect_demo", carimage)
cv.imshow("car_detect_Demo", notcarimage)
cv.waitKey(0)
cv.destroyAllWindows()
代码的编写模仿于由乔.米尼奇诺编写的opencv3计算机视觉python实现。