100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > (Python)从零开始 简单快速学机器仿人视觉Opencv---运用二:物体检测

(Python)从零开始 简单快速学机器仿人视觉Opencv---运用二:物体检测

时间:2019-03-20 22:08:45

相关推荐

(Python)从零开始 简单快速学机器仿人视觉Opencv---运用二:物体检测

教程:

博主之前写了22节关于使用OpenCV的教程,欢迎大家阅读:

(Python)从零开始,简单快速学机器仿人视觉Opencv—第一节:OpenCV的图像读取显示及保存

(Python)从零开始,简单快速学机器仿人视觉Opencv—第二节:OpenCV的视频操作

(Python)从零开始,简单快速学机器仿人视觉Opencv—第三节:OpenCV中的绘图函数

(Python)从零开始,简单快速学机器仿人视觉Opencv—第四节:OpenCV处理鼠标事件

(Python)从零开始,简单快速学机器仿人视觉Opencv—第五节:OpenCV用滑动条做调色板

(Python)从零开始,简单快速学机器仿人视觉Opencv—第六节:OpenCV图像的一些基本操作

(Python)从零开始,简单快速学机器仿人视觉Opencv—第七节:图像上的算术运算

(Python)从零开始,简单快速学机器仿人视觉Opencv—函数讲解1:cv2.flip()函数

(Python)从零开始,简单快速学机器仿人视觉Opencv—第八节:程序性能检测及优化

(Python)从零开始,简单快速学机器仿人视觉Opencv—第九节:颜色空间转换

(Python)从零开始,简单快速学机器仿人视觉Opencv—第十节:五种常见的几何变换

(Python)从零开始,简单快速学机器仿人视觉Opencv—第十一节:图像阀值

(Python)从零开始,简单快速学机器仿人视觉Opencv—第十二节:几种常见的图像滤波、平滑

(Python)从零开始,简单快速学机器仿人视觉Opencv—第十三节:形态学转换

(Python)从零开始,简单快速学机器仿人视觉Opencv—第十四节:图像梯度

(Python)从零开始,简单快速学机器仿人视觉Opencv—第十五节:Canny边缘检测

(Python)从零开始,简单快速学机器仿人视觉Opencv—第十六节:图像金字塔

(Python)从零开始,简单快速学机器仿人视觉Opencv—第十七节:轮廓详解与运用

(Python)从零开始,简单快速学机器仿人视觉Opencv—第十八节:轮廓的性质

(Python)从零开始,简单快速学机器仿人视觉Opencv—第十九节:关于轮廓的函数

(Python)从零开始,简单快速学机器仿人视觉Opencv—第二十节:轮廓的层次结构

(Python)从零开始,简单快速学机器仿人视觉Opencv—运用一:快速截取图像中指定单个物体

主题

本章我们要学习的是目标物体检测,这里我们需要使用到SIFT特征提取,BOW词袋建立以及SVM支持向量机的知识(这些讲起来有点费劲(所以还是咕咕咕吧)),使用的数据集为UIUC数据集,可以去百度云盘免费下载,提取码为:wdzr。

这里我们要进行的是车辆的检测:检测图像中是否存在车辆,具体实现的我们可以将程序分为以下几步:

第1步:生成sift检测和提取器(注意:由于SIFT和SURF在3.4.3版本的时候注册了专利,所以在3.4.3及之后的版本中都无法再使用SIFT和SURF类了,所以需要将OpenCV的版本调整到3.4.2.16或者更早的版本)

import cv2import numpy as np#生成sift检测和提取器detect=cv2.xfeatures2d.SIFT_create()extract=cv2.xfeatures2d.SIFT_create()

第2步:生成flann特征匹配器

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

第3步:生成bow_kmeans_trainer,BOW训练器

#生成bow_kmeans_trainer,BOW训练器,设置40个簇bow_kmeans_trainer=cv2.BOWKMeansTrainer(40)

第4步:使用SIFT或者SURF提取图片描述符,并加入到BOW训练器中。(这里只选用了正、负匹配各40张,如果匹配不准确的话可以提高训练的数量)

#使用SIFT或者SURF提取图片描述符,并加入到BOW训练器中for i in range(40):#正匹配需要的图片的路径pos_pic='%s%s%d.pgm'%('carData/TrainImages/','pos-',i)#加载图片pos_img=cv2.imread(pos_pic,0)#计算这个正匹配图像的图像描述符pos_des=pute(pos_img,detect.detect(pos_img))[1]#将图像描述符放入BOW训练器bow_kmeans_trainer.add(pos_des)# 负匹配需要的图片的路径neg_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'neg-', i)# 加载图片neg_img = cv2.imread(neg_pic, 0)# 计算这个负匹配图像的图像描述符neg_des = pute(neg_img, detect.detect(neg_img))[1]# 将图像描述符放入BOW训练器bow_kmeans_trainer.add(neg_des)

第5步:使用SIFT特征提取和flann生成bow特征提取器,extract_bow

#使用SIFT特征提取和flann生成bow特征提取器,extract_bowextract_bow=cv2.BOWImgDescriptorExtractor(extract,flann)

第6步:将BOW训练器中的图像描述符进行k-means聚类,得到词汇,对BOW特征提取器进行词汇的设置

#将BOW训练器中的图像描述符进行k-means聚类,得到词汇,对BOW特征提取器进行词汇的设置voc=bow_kmeans_trainer.cluster()extract_bow.setVocabulary(voc)

第7步:用BOW特征提取器提取对应图像的数据加入到traindata中,对应标号1与-1加入到trainlabels中

#用BOW特征提取器提取对应图像的数据加入到traindata中,对应标号1与-1加入到trainlabels中traindata=[]trainlabels=[]for i in range(20):# 正匹配需要的图片的路径pos_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'pos-', i)# 加载图片pos_img = cv2.imread(pos_pic, 0)# 计算这个正匹配图像的BOW特征描述符pos_des = pute(pos_img, detect.detect(pos_img))# 将BOW特征描述符放入训练数据中traindata.extend(pos_des)#将正标签加入trainlabels中trainlabels.append(1)# 负匹配需要的图片的路径neg_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'neg-', i)# 加载图片neg_img = cv2.imread(neg_pic, 0)# 计算这个正匹配图像的BOW特征描述符neg_des = pute(neg_img, detect.detect(neg_img))# 将BOW特征描述符放入训练数据中traindata.extend(neg_des)# 将负标签加入trainlabels中trainlabels.append(-1)

第8步:生成SVM

#生成SVMsvm=cv2.ml.SVM_create()

第9步:用traindata和trainlabels对SVM进行训练

#用traindata和trainlabels对SVM进行训练svm.train(np.array(traindata),cv2.ml.ROW_SAMPLE,np.array(trainlabels))

第10步:对指定图像进行BOW特征提取后,使用SVM进行评分预判。这里我们使用下面两张图分别对应有车和没车的情况来做图像判断:

本块代码如下所示:

#对指定图像进行BOW特征提取后,使用SVM进行评分预判#有车car=cv2.imread('1.jpg')car_gray=cv2.cvtColor(car,0)#没车no_car=cv2.imread('2.jpg')no_car_gray=cv2.cvtColor(no_car,0)#预判car_bow_des=pute(car_gray,detect.detect(car_gray))no_car_bow_des=pute(no_car_gray,detect.detect(no_car_gray))car_predict=svm.predict(car_bow_des)no_car_predict=svm.predict(no_car_bow_des)#图像显示if car_predict[1][0][0]==1.0:cv2.putText(car,'Car Detected',(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2,cv2.LINE_AA)if no_car_predict[1][0][0]==-1.0:cv2.putText(no_car,'Nocar Detected',(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2,cv2.LINE_AA)cv2.imshow('car',car)cv2.imshow('nocar',no_car)cv2.waitKey(0)cv2.destroyAllWindows()

将上面十步完成后,运行代码,可以得到如下画面:

全部代码如下所示:

import cv2import numpy as np#生成sift检测和提取器detect=cv2.xfeatures2d.SIFT_create()extract=cv2.xfeatures2d.SIFT_create()#生成flann匹配器flann_params=dict(algorithm=1,trees=5)flann=cv2.FlannBasedMatcher(flann_params,{})#生成bow_kmeans_trainer,BOW训练器,设置40个簇bow_kmeans_trainer=cv2.BOWKMeansTrainer(40)#使用SIFT或者SURF提取图片描述符,并加入到BOW训练器中for i in range(40):#正匹配需要的图片的路径pos_pic='%s%s%d.pgm'%('carData/TrainImages/','pos-',i)#加载图片pos_img=cv2.imread(pos_pic,0)#计算这个正匹配图像的图像描述符pos_des=pute(pos_img,detect.detect(pos_img))[1]#将图像描述符放入BOW训练器bow_kmeans_trainer.add(pos_des)# 负匹配需要的图片的路径neg_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'neg-', i)# 加载图片neg_img = cv2.imread(neg_pic, 0)# 计算这个负匹配图像的图像描述符neg_des = pute(neg_img, detect.detect(neg_img))[1]# 将图像描述符放入BOW训练器bow_kmeans_trainer.add(neg_des)#使用SIFT特征提取和flann生成bow特征提取器,extract_bowextract_bow=cv2.BOWImgDescriptorExtractor(extract,flann)#将BOW训练器中的图像描述符进行k-means聚类,得到词汇,对BOW特征提取器进行词汇的设置voc=bow_kmeans_trainer.cluster()extract_bow.setVocabulary(voc)#用BOW特征提取器提取对应图像的数据加入到traindata中,对应标号1与-1加入到trainlabels中traindata=[]trainlabels=[]for i in range(20):# 正匹配需要的图片的路径pos_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'pos-', i)# 加载图片pos_img = cv2.imread(pos_pic, 0)# 计算这个正匹配图像的BOW特征描述符pos_des = pute(pos_img, detect.detect(pos_img))# 将BOW特征描述符放入训练数据中traindata.extend(pos_des)#将正标签加入trainlabels中trainlabels.append(1)# 负匹配需要的图片的路径neg_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'neg-', i)# 加载图片neg_img = cv2.imread(neg_pic, 0)# 计算这个正匹配图像的BOW特征描述符neg_des = pute(neg_img, detect.detect(neg_img))# 将BOW特征描述符放入训练数据中traindata.extend(neg_des)# 将负标签加入trainlabels中trainlabels.append(-1)#生成SVMsvm=cv2.ml.SVM_create()#用traindata和trainlabels对SVM进行训练svm.train(np.array(traindata),cv2.ml.ROW_SAMPLE,np.array(trainlabels))#对指定图像进行BOW特征提取后,使用SVM进行评分预判#有车car=cv2.imread('1.jpg')car_gray=cv2.cvtColor(car,0)#没车no_car=cv2.imread('2.jpg')no_car_gray=cv2.cvtColor(no_car,0)#预判car_bow_des=pute(car_gray,detect.detect(car_gray))no_car_bow_des=pute(no_car_gray,detect.detect(no_car_gray))car_predict=svm.predict(car_bow_des)no_car_predict=svm.predict(no_car_bow_des)#图像显示if car_predict[1][0][0]==1.0:cv2.putText(car,'Car Detected',(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2,cv2.LINE_AA)if no_car_predict[1][0][0]==-1.0:cv2.putText(no_car,'Nocar Detected',(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2,cv2.LINE_AA)cv2.imshow('car',car)cv2.imshow('nocar',no_car)cv2.waitKey(0)cv2.destroyAllWindows()

总结

(前一段日子在赶着写书,被催稿(吐)导致的本系列咕咕咕了,之后可能还会咕,但是还是会尽量快的更新,谢谢大家支持啦!)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。