OpenCV:涉及概念、常见函数、常用案例总结

一、OpenCV使用过程:

在opencv中进行人脸或者人眼 或者身体的检测 首先就是训练好级联分类器CascadeClassifier,并通过不同的分类器类型进行初始化,然后就是检测就行。

级联分类器整个过程主要包括:样本准备,数据生成,训练,交叉验证,检测

(1) 样本标注的工具:
applications->opencv_annotation   opencv_annotation.exe  注意:在标注的过程中,需要注意标注程序要能正确读取到相应的图像。每次画完标注框,需要按C键才能保存该标注框。  
(2) 测试或训练样本的生成工具:
applications->opencv_createsamples    opencv_createsamples.exe  说明:将样本以向量的方式写到vec文件中,给定正样本进行变形的方法没有成功,目前只试过第三种方法:给定正样本图像集合文件(即第一步获得的标注文件),将样本文件的每个样本逐个写到vec文件中,超过样本图像数后会输出parse error,但不是报错,属正常结束。  
(3) 级联分类器训练工具: 
applications->opencv_traincascade中的cascadeclassifier中的CvCascadeClassifier类,主要用于train,但具有私有方法predict; opencv_traincascade.exe (之前的诸如:贝叶斯,k-nn,SVM,决策树,随机树等等,在old_ml中。但在boost中的CvCascadeBoost类,也有相关的公有的训练和预测方法,与级联分类器的区别需要进一步确认)  说明:bgName参数为负样本描述文件(.dat),文件中包含一系列的图像文件名,这些图像将被随机选作物体的背景,具体可以是每一行为一个包含绝对路径的背景图像文件名。  
(4) 级联分类器检测:
可以利用modules->opencv_objdetect中cascadedetect中的CascadeClassifierImpl类;也可以利用opencv2/objdetect.hpp定义的CascadeClassifier类,具体在modules->opencv_objdetect->Src中cascadedetect.cpp中实现(基于BaseCascadeClassifier类实现);也可以利用训练工具中的predict方法进行预测。 
(5) Opencv提供了测试方法:
tests accuracy->opencv_test_objdetect的测试方法;tests performance->opencv_perf_objdetect的测试方法。

二、OpenCV的相关概念:

(1)OpenCV的级联分类器:分为两部分,训练与检测。训练那块代码在apps目录下,有旧分类器haartraining和新分类器traincascade各自的代码。目前没去看,训练用OpenCV给的程序目前就足够了。
(2)XML:可理解为一种小型的数据库。是eXtensible Markup Language, 翻译成中文就是“可扩展标识语言“。首先XML是一种元标记语言,所谓“元标记”就是开发者可以根据自己的需要定义自己的标记,比如开发者可以定义如下标记<book> <name>,任何满足xml命名规则的名称都可以标记,这就为不同的应用程序打开了的大门。 第二xml是一种语义/结构化语言。它描述了文档的结构和语义。XML可利用于数据交换 主要是因为XML表示的信息独立于平台的,这里的平台即可以理解为不同的应用程序也可以理解为不同的操作系统;它描述了一种规范,利用它Microsoft的word文档可以和Adobe 的Acrobat交换信息,可以和数据库交换信息。  


OpenCV一些常用函数

HOG detectMultiScale 

winStride(可选)  HoG检测窗口移动时的步长(水平及竖直)。  winStride和scale都是比较重要的参数,需要合理的设置。一个合适参数能够大大提升检测精确度,同时也不会使检测时间太长。

padding(可选)  在原图外围添加像素,作者在原文中提到,适当的pad可以提高检测的准确率(可能pad后能检测到边角的目标?)  常见的pad size 有(8, 8), (16, 16), (24, 24), (32, 32).

参数分析,参考博客https://www.cnblogs.com/klitech/p/5747895.html


CV_WRAP virtual void detectMultiScale( const Mat& image,
                      CV_OUT vector<Rect>& objects,
                      double scaleFactor=1.1,
                      int minNeighbors=3, int flags=0,
                      Size minSize=Size(),

                      Size maxSize=Size() );

minSize=Size()、maxSize=Size(): 决定了检测到的最小和最大的人脸大小,如果图片中人脸距离相机较远,把minSize参数设置为=Size(20,20) 
scaleFactor:参数决定由多少不同大小的人脸要搜索,通常为1.1 
minNeighbors: 决定着人脸检测器如何确定人脸已经被找到,默认值是3,如果改为4的话,将会使检测的正确率增加,但是漏检率也可能增加,可以理解为参数越大,判断的条件越苛刻。 

flags:是否要检测所有人脸。

 下面我来跟大家讲一下IMG取某区域内图像的坐标以及cv2.rectangle的定位坐标。参考博客https://www.cnblogs.com/fightccc/p/8616068.html

      1)cv2.rectangle,我们从上面的注释中知道,获取的是左上角和右下角的顶点坐标,用画图的方式表达如下:

      2)IMG区域取值范围则和1)不同,IMG[左上顶点y:左下顶点y,左上顶点x:右上顶点x],用图来表示S◇acef区域如下:

         所以,之后截取后记得以最原始的IMG坐标为顶点,再来表示要截取的区域,不然就会报错。

一、OpenCV内部常用方法集合

1、cv2.namedWindow('窗口标题',默认参数)  

 创建命名窗口,默认参数:cv2.WINDOW_AUTOSIZE+cv2.WINDOW_KEEPRATIO+cv2.WINDOW_GUI_EXPANDED)  
参数: 
cv2.WINDOW_NORMAL     窗口大小可改变 
cv2.WINDOW_AUTOSIZE   窗口大小不可改变 
cv2.WINDOW_FREERATIO  自适应比例 
cv2.WINDOW_KEEPRATIO  保持比例饿 
cv2.WINDOW_GUI_NORMAL 
cv2.WINDOW_GUI_EXPANDED 

用法:cv2.imshow('窗口标题', image),如果前面没有cv2.namedWindow,就自动先执行一个cv2.namedWindow。

2、cv2.imshow()

显示图像 ,使用函数cv2.imshow() 显示图像。窗口会自动调整为图像大小。第一个参数是窗口的名字,其次才是我们的图像。

3、cv2.imread()  
图像读入 ,使用函数cv2.imread() 读入图像。这幅图像应该在此程序的工作路径,或者给函数提供完整路径,第二个参数是要告诉函数应该如何读取这幅图片。  
cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略,  这是默认参数。  
cv2.IMREAD_GRAYSCALE:以灰度模式读入图像

4、cv2.imwrite()  
#保存图像 cv2.imwrite('photo.jpg',img)

5、cv2.waitKey() 
是一个键盘绑定函数。需要指出的是它的时间尺度是毫 秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果 按下任意键,这个函数会返回按键的ASCII 码值,程序将会继续运行。如果没 有键盘输入,返回值为-1,如果我们设置这个函数的参数为0,那它将会无限 期的等待键盘输入。它也可以被用来检测特定键是否被按下,例如按键a 是否 被按下。
6、cameraCapture.release()  #函数释放Camera,以便其他应用程序调用,结束后一定要释放Camera
cv2.destroyAllWindows()
#删除建立的全部窗口;可以轻易删除任何我们建立的窗口。如果 你想删除特定的窗口可以使用,在括号内输入你想删 除的窗口名。

7、cv2.resize(image, image2,dsize)
图像缩放方法;即(输入原始图像,输出新图像,图像的大小)
7.1cv2.INTER_LINEAR    #图像尺寸变换的方法,默认的双线性插值
7.2cv2.putText(img,'text',(50,150),cv2.FONT_HERSHEY_COMPLEX,6,(0,0,255),25)  
#(照片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细)
7.3cv2.boundingRect(img) 
#img是一个二值图,也就是它的参数; 返回四个值,分别是x,y,w,h;  x,y是矩阵左上点的坐标,w,h是矩阵的宽和高
例如:cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2) #画出矩行 ;
(img是原图,(x,y)是矩阵的左上点坐标,(x+w,y+h)是矩阵的右下点坐标,(0,255,0)是画线对应的rgb颜色,2是所画的线的宽度)

8、gray = cv2.cvtColor(i, cv2.COLOR_BGR2GRAY)

颜色空间转换:生活中大多数看到的彩色图片都是RGB类型,但是在进行图像处理时,需要用到GRAY灰度图、二值图、HSV、HSI等颜色制式,opencv提供了cvtColor()函数来实现这些功能

 

9、cv2.imwrite()

#Saves an image to a specified file

10、cv2.VideoCapture(0) 

#函数定义摄像头对象,其参数0表示第一个摄像头,一般就是笔记本的内建摄像头。

11、cameraCapture.read()  #从摄像设备中读入数据

12、cv2.waitKey(1) == -1:  
#不断刷新图像,频率delay=1单位ms;如果delay>0,那么超过指定时间则返回-1;如果delay=0,将没有返回值;键盘绑定函数:看键盘是否有输入,返回值为ASCII值。如果参数为0,则表示无限期的等待键盘输入。

13、detectMultiScale #cv2中人脸、猫脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸、眼睛、嘴等(依据所调用的分类器);函数由分类器对象调用。
detectMultiScale(const Mat& image, vector& objects, double scaleFactor=1.1,int minNeighbors, int flag,cvSize) 
1. image为输入的灰度图像  
2. objects为得到被检测物体的矩形框向量组  
3. scaleFactor为每一个图像尺度中的尺度参数,默认值为1.1。scale_factor参数可以决定两个不同大小的窗口扫描之间有多大的跳跃,这个参数设置的大,则意味着计算会变快,但如果窗口错过了某个大小的人脸,则可能丢失物体。  如1.3
4. minNeighbors参数为每一个级联矩形应该保留的邻近个数,默认为3。minNeighbors控制着误检测,默认值为3表明至少有3次重叠检测,我们才认为人脸确实存。  
5. flags对于新的分类器没有用(但目前的haar分类器都是旧版的,CV_HAAR_DO_CANNY_PRUNING,这个值告诉分类器跳过平滑(无边缘区域)。利用Canny边缘检测器来排除一些边缘很少或者很多的图像区域;CV_HAAR_SCALE_IMAGE,这个值告诉分类器不要缩放分类器。而是缩放图像(处理好内存和缓存的使用问题,这可以提高性能。)就是按比例正常检测;CV_HAAR_FIND_BIGGEST_OBJECTS,告诉分类器只返回最大的目标(这样返回的物体个数只可能是0或1)只检测最大的物,CV_HAAR_DO_ROUGH_SEARCH,他只可与CV_HAAR_FIND_BIGGEST_OBJECTS一起使用,这个标志告诉分类器在任何窗口,只要第一个候选者被发现则结束寻找(当然需要足够的相邻的区域来说明真正找到了。),只做初略检测.  
6. cvSize()指示寻找人脸的最小区域。设置这个参数过大,会以丢失小物体为代价减少计算量。

OpenCV一些常用案例

Python-OpenCV基本操作方法详解http://www.jb51.net/article/137568.htm

1、打开一张图片

import cv2 

img = cv2.imread("F:\\File_Python\\Python_example\\faceRecognition-master\\Original_picture\\Jason_niu\\Jason_niu (1).jpg") 
cv2.namedWindow("Image") 
cv2.imshow("Image", img) 
cv2.waitKey (0)
cv2.destroyAllWindows()

OpenCV实现检测几何形状并进行识别、输出周长、面积、颜色、形状类型
轮廓提取:在OpenCV中使用轮廓发现相关函数时候要求输入图像是二值图像,这样便于轮廓提取、边缘提取等操作。轮廓发现的函数与参数解释如下:  
findContours ( image ,  mode ,  method ,  contours = None ,  hierarchy = None ,  offset = None ) 
-  image 输入/输出的二值图像 
-  mode  返回轮廓的结构、可以是 List 、 Tree 、 External 
-  method  轮廓点的编码方式,基本是基于链式编码 
-  contours  返回的轮廓集合 
-  hieracrchy  返回的轮廓层次关系 
-  offset  点是否有位移

多边形逼近:是通过对轮廓外形无限逼近,删除非关键点、得到轮廓的关键点,不断逼近轮廓真实形状的方法,OpenCV中多边形逼近的函数与参数解释如下:  
approxPolyDP ( curve ,  epsilon ,  closed ,  approxCurve = None ) 
-  curve  表示输入的轮廓点集合 

-  epsilon  表示逼近曲率,越小表示相似逼近越厉害 -  close  是否闭合

几何距计算:图像几何距是图像的几何特征,高阶几何距中心化之后具有特征不变性,可以产生Hu距输出,用于形状匹配等操作,这里我们通过计算一阶几何距得到指定轮廓的中心位置,计算几何距的函数与参数解释如下:  
moments ( array ,  binaryImage = None )
-  array 表示指定输入轮廓 
-  binaryImage 默认为 None

猜你喜欢

转载自blog.csdn.net/qq_41185868/article/details/79805349
今日推荐