opencvhaar源码
‘壹’ 如何查看Opencv中函数的源代码
opencv都带有这个函数的代码,你在用的时候,选择函数,然后右键选择”go to denifition of cvCalOpticalFlowHS"--->然后就会跳 到定义cvCalOpticalFlowHS的定义文件,就会跳到cv.h头文件来(说明cvCalOpticalFlowHS在cv.h文件中定义的),然后你去cv.cpp文件,按"Ctrl+F" 输入函数名进行搜索,就能找到cvCalOpticalFlowHS函数的源文件了。
1、首先要熟悉openCV安装目录,例如游旁我的安装目录是F:\program files\opencv2.3.1。在这个目录下面还有很多子目录:3rdparty、android、build,data、doc、include、moles、samples和很多cmake文件。对于编程来说,仅仅需要build这一个文件夹就可以了,因为编程环境的配置只与这一个目录有关,如:包含目录配置、库目录配置build目录是编译生成的目录,就是用openCV源代码编译生成的2进制库文件集(dll、lib和入口头文件include)。
2、那其他文件夹下的文件都是干嘛用的呢?其实源代码就包含在这些文件夹下面,因为build文件夹就是在其他文件夹的基础上CMake编译生成的汪磨亏
例如,core文件夹下就包含了基本数据类型的定义,imgproc文件夹下包含了常用的数字图像困神处理函数源代码:如cvCanny()、cvSobel()。
3、用CMake导出opencv 源码,生成VC++项目,然后用vs打开工程,去里面搜索整个工程
‘贰’ opencv进阶1
在Opencv中人脸识别是基于Haar特征+Adaboost级联分类器来实现人脸识别的!
要理解这节内容,我们首先要明白什么是特征?
特征其实就是某个区域的像素点经过运算之后得到的结果! 例如haar特征其实就是用下图列出的模板在图像中滑动,计算白色区域覆盖的像素之和减去黑色区域覆盖的像素之和,运算出来的结果就是haar特征值!
Haar特征一般和Adaboost分类器结合在一起进行目标识别!
这里需要运动机器学习的知识! 不过值得庆幸的是Opencv已经为我们训练好了数据,并且已经提取出了人脸的特征,在opencv的源码中有相应的xml特征文件. 并且我们只需要调用opencv提供好的API即可快速完成人脸识别的功能!
核心api为:
实现步骤:
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
结论:
注意: 在opencv中,H、S、V值范围分别是[0,180],[0,255],[0,255],而非[0,360],[0,1],[0,1];
这里我们列出部分hsv空间的颜色值, 表中将部分紫色归为红色
[图片上传失败...(image-4f70f7-1563843266225)]
.jpg)
注意,这仅仅只能做一个比较粗糙的判定,按照我们人的正常思维,在傍晚临界点我们也无法判定当前是属于晚上还是白天!
在一张图片中,如果某个物体的颜色为纯色,那么我们就可以使用颜色过滤inRange的方式很方便的来提取这个物体.
下面我们有一张网球的图片,并且网球的颜色为一定范围内的绿色,在这张图片中我们找不到其它颜色也为绿色的图片,所以我们可以考虑使用绿色来提取它!
图片的颜色空间默认为BGR颜色空间,如果我们想找到提取纯绿色的话,我们可能需要写(0,255,0)这样的内容,假设我们想表示一定范围的绿色就会很麻烦!
所以我们考虑将它转成HSV颜色空间,绿色的色调H的范围我们很容易知道,剩下的就是框定颜色的饱和度H和亮度V就可以啦!
实现步骤:
图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0 或 255,也就是将整个图像呈现出明显的黑白效果的过程。
在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
[图片上传失败...(image-a31052-1563843266226)]
我们使用一个全局值作为阈值。但是在所有情况下这可能都不太好,例如,如果图像在不同区域具有不同的照明条件。在这种情况下,自适应阈值阈值可以帮助。这里,算法基于其周围的小区域确定像素的阈值。因此,我们为同一图像的不同区域获得不同的阈值,这为具有不同照明的图像提供了更好的结果。
除上述参数外,方法cv.adaptiveThreshold还有三个输入参数:
该 adaptiveMethod 决定阈值是如何计算的:
该 BLOCKSIZE 确定附近区域的大小和 Ç 是从平均值或附近的像素的加权和中减去一个常数。
采用日本人大津提出的算法,又称作最大类间方差法,被认为是图像分割中阈值选取的最佳算法,采用这种算法的好处是执行效率高!
<img src="./img2/otsu.jpg" width="500" />
如果我们把图像看作信号,那么噪声就是干扰信号。我们在采集图像时可能因为各种各样的干扰而引入图像噪声。在计算机中,图像就是一个矩阵, 给原始图像增加噪声, 我们只需要让像素点加上一定灰度即可.
f(x, y) = I(x, y) + noise
常见的噪声有椒盐噪声(salt and pepper noise),为什么叫椒盐噪声?因为图像的像素点由于噪声影响随机变成了黑点(dark spot)或白点(white spot)。这里的“椒”不是我们常见的红辣椒或青辣椒,而是外国的“胡椒”(香料的一种)。我们知道,胡椒是黑色的,盐是白色的,所以才取了这么个形象的名字.
接下来我们来生成10%的椒噪声和盐噪声:
我们还要注意,opencv的图像矩阵类型是uint8,低于0和高于255的值并不截断,而是使用了模操作。即200+60=260 % 256 = 4。所以我们需要先将原始图像矩阵和噪声图像矩阵都转成浮点数类型进行相加操作,然后再转回来。
‘叁’ 为什么需要编译OpenCV源代码
..\OpenCV2.3\opencv\moles 这个目录有一些常用的库,一般算法的实现是看不到的,通常在静态库里,你可以连接他们,生成执行文件。
hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的虎矗港匪蕃睹歌色攻姬obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。
‘肆’ 怎么查看opencv源代码呢
1、找到Opencv的安装目录,例如安装目录在F盘,找到相应的安装目录如下所示
‘伍’ 如何利用opencv2.4.9中的人脸识别源码实现自己的demo
首先找到解压路径下【opencv】-【sources】-【data】-【haarcascades】
路径下面的
"haarcascades_eye_tree_eyeglasses.xml"和"haarcascade_frontalface_alt.xml"文件。,放到自己的工程目录下,然后新建cpp,编写如下代码:
#include"opencv2/core/core.hpp"
#include"opencv2/objdetect/objdetect.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include<iostream>
#include<stdio.h>
usingnamespacestd;
usingnamespacecv;
stringface_cascade_name="haarcascade_frontalface_alt.xml";
CascadeClassifierface_cascade;
stringwindow_name="人脸识别";
voiddetectAndDisplay(Matframe);
intmain(intargc,char**argv){
Matimage;
image=imread(argv[1]);
if(argc!=2||!image.data){
printf("[error]没有图片 ");
return-1;
}
if(!face_cascade.load(face_cascade_name)){
printf("[error]无法加载级联分类器文件! ");
return-1;
}
detectAndDisplay(image);
waitKey(0);
}
voiddetectAndDisplay(Matframe){
std::vector<Rect>faces;
Matframe_gray;
cvtColor(frame,frame_gray,CV_BGR2GRAY);
equalizeHist(frame_gray,frame_gray);
face_cascade.detectMultiScale(frame_gray,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));
for(inti=0;i<faces.size();i++){
Pointcenter(faces[i].x+faces[i].width*0.5,faces[i].y+faces[i].height*0.5);
ellipse(frame,center,Size(faces[i].width*0.5,faces[i].height*0.5),0,0,360,Scalar(255,0,255),4,8,0);
}
imshow(window_name,frame);
}
‘陆’ 怎么在vs2022中编译opencvmat类的源码
1. 首先需要在VS2022中添加OpenCV库,可以通过NuGet Package Manager搜索并安装OpenCV。
2. 打开VS2022,创建一个新的C++项目。
3. 在项目属性中,选择VC++目录,添加OpenCV库的包含目录和库目录。
4. 在链接器中,添加需要链接的OpenCV库。
5. 在代码中包含需要使用的头文件,例如<opencv2/opencv.hpp>。
6. 编写代码,使用OpenCV的Mat类。
7. 按下F7编译代码。
结论:在VS2022中编译OpenCV的Mat类源码需要添加OpenCV库,并在项目属性中设置相关选项。
原因:OpenCV是一个开源计算机视觉库,包含了许多图像和视频处理的函数和类,其中的Mat类用于存储和操作多维数组。
在VS2022中编译OpenCV的Mat类源码需要添加OpenCV库,并在项目属性中设置相关选项,以便编译器能够正确地链接和使用OpenCV库。
内容延伸:除了在VS2022中编译OpenCV的Mat类源码,OpenCV还提供了搭禅许多其他功能和类,例如图像处理、特征提取、目标识别等,可以根据需要使用。
此外,还清做可以使用OpenCV与其他答枝衡计算机视觉库和框架(如TensorFlow、PyTorch等)结合使用,以实现更复杂的计算机视觉任务。