vscode配置opencv C++ 环境与人脸检测(不是人脸识别)算法的尝试

vscode配置opencv C++ 环境与人脸检测(不是人脸识别)算法的尝试,第1张

估计这学期都去不了学校了,家里蹲大学马上要线上期中考。



在家呆久了无聊想学点机器视觉的东西,之前在学校双创课上做过python的机器视觉实验,想起来挺有意思的,但是还是比较喜欢C++,就找到了这个看上去还不错的C++开源项目 ,opencv。

首先是配置opencv环境。

看了很多教程,下面这个是最详细的,最后是参照上面这篇博客 成功完成了配置,感谢大佬。

之前出现过很多奇怪的问题,也学到了一些经验,在这里记录一下。

(2条消息) VScode搭建Opencv(C++开发环境)_河旬的博客-CSDN博客_vscode配置opencv

1.MinGW的版本问题:之前是在电脑里装了MinGW环境的,所以直接按照教程安装了Cmake,结果configure的时候一直报错“MinGW缺少mingw-make.exe”,查找MinGW目录,明明有这个文件。

后来发现MinGW不是最新版的,而且有博客提起过,只有seh版的MinGW才能Cmake中成功的configure。

于是删了MinGW,重新安装了一下MinGW。

而且发现由于奇怪的网络问题,MinGW不能在线安装了,于是下载安装压缩包安装上了版本正确的MinGW。

好像这种python库或c++库的安装都很有时效性,各软件版本正确是很关键的。

2.Cmake的configure过程,要下载一些东西,有时候由于奇怪的问题下载不了,列表会变红,这时候可以通过科学上网,或者手动搜索下载无法下载的文件补上。

新建一个文件夹作为“where to build the binaries"地址选项,不然后面会很乱。

3.由于之前配置过了vscode的各种json文件,就直接在上面改了,开始我只在IncludePath下添加了新的opencv的相关头文件路径,结果是编辑器检测没报错,按住ctrl键也可以打开查看源文件,但是一编译就报错无法打开头文件,查了好多资料才知道,c_cpp_properties.josn中添加的路径只是告诉编辑器的,让编辑器不打红色波浪线,但是此时编译器还不知道这个引用,要在tasks.json中添加相关的路径才会正常编译。

并且了解到了.dll(用于动态链接库导出函数,在运行期间链接).lib(用于动态链接库导出函数,在编译期间)和.a(静态库文件)的区别。

以及“-I"(小写L) "-I”(大写i)命令,相当于添加动态程序库链接,静态文件库链接之类的。

    "tasks": [
        {
            "type": "shell",
            "label": "opencv",
            "command": "D:/mingw64/bin/g++.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${workspaceFolder}\Debugger\${fileBasenameNoExtension}.exe",
                "D:/opencv/build/x64/mingw/bin/libopencv_world455.dll",
                "-I",
                "D:/opencv/build/x64/mingw/install/include",//需要添加的路径
                "-I",
                "D:/opencv/build/x64/mingw/install/include/opencv2",//需要添加的路径
            ],
            "options": {
                "cwd": "D:/mingw64/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]

4.发现搞清楚这个问题之后,face.cpp头文件还是会报错,结果是最新版的opencv把这个头文件暂时下架了,原因是不稳定,要重新开发,网上教程说要在另一个库里opencv_contrib自行下载。



这个源文件。

搞清楚了环境的安装配置之后,头文件终于不报错了,也可以正常编译了。

马上按照网上的代码学习尝试了下opencv自带的人脸检测算法。

在刚刚下载的opencv中,可以找到这些文件

 据说这些文件是github大佬们将模型训练之后得到的数据样本库,通过调用一个opencv里的函数就可以利用这些模型的数据做相关的一些实验了。

里面有各种各样的模型,有的是检测人脸的,有的是检测上半身的,有的是检测眼睛部位的。

总之感觉都很神奇。

然后是学习代码时间,了解一下相关的工序,将图片灰度化,均衡化什么的,建立连级检测器,导入刚刚的分类器训练文件,熟悉下opencv的基本文件 *** 作:

1-遍历文件夹内的文件,通过glode函数实现,大概就是读取指定文件夹下的路径保存在一个vector中;

2-imread()读取图片文件,namewindow()显示图片的窗体。

imwrite()写入图片;

之后我利用下面的代码尝试了下,在一个文件夹下挑选出含有人脸的jpg或png格式的图片,看看效果。

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include 
#include 
#include
#include
#include
#include
using namespace std;
using namespace cv;

CascadeClassifier face_cascade[4];//建立连级采样器

bool detect( Mat frame ,int i,cv::String name)
{
    Mat frame_gray;
	Mat converse;
    cvtColor( frame, frame_gray, COLOR_BGR2GRAY );//颜色空间转换函数,将图像转化为灰度图像
    equalizeHist( frame_gray, frame_gray );//直方图均衡化函数
    std::vector faces;//RECT类用于描述矩形
	//flip(frame_gray,converse,1);//反转图片,可用于侧脸检测
	bool isfind=false;
	face_cascade[1].detectMultiScale(frame_gray, faces);//用于检测的函数
	if(faces.size()){
		cout<<"第"< image_files_jpg,image_files_png;
	glob(pattern_jpg,image_files_jpg);
	glob(pattern_png,image_files_png);
	for(int i=0;i

反复测试了多个训练器模型文件后,发现这些模型的识别准确率远低于我的预期,误检率和漏检率都非常的高。



反复调试了detectMultiScale的七个参数,发现正确率始终不是很高。

用三十张含有人脸的照片,最好的一次检出了二十一张含有人脸,也就是70%左右。

不知道是我的参数没设置合适还是其他什么原因,正确率基本上不超过70%。

检测人眼的,和检测上半身的正确率更离谱。



上网也没查到什么资料(一查人脸检测的讨论,出来的都是人脸识别)。

而且检测很耗时,基本上一张图片要几秒钟。

虽然这不是最好的人脸检测算法,但是也不至于这么低吧,我以为至少有百分之九十以上准确率。

结果比较失望。

了解到还有一些其他的比较优秀的人脸检测算法,但是限于缺少获取途径和能力(好像他们不是开源的),无法再简单的实践体验了。

想问问有大佬知道这个算法的最优正确率有多高吗?或者怎么改进提高检测正确率?

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/674087.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)