学习编程更多是基于项目基础的
我这里做了一个简单项目:基于OpenCV的人脸识别
首先,安装和配置OpenCV环境,百度上有很多,这里就不多描述了,主要记录一些函数的使用方法和项目实现思路
项目实现分析:
将图像库中的文件读取到image模型中,将图片转化为二值图像,通过卷积变换得到特征信息,创建神经网络,将特征值分类输出。
准备工作
系统: Ubuntu18.04LTS
图像处理: OpenCV
神经网络: TensorFlow
图像库: MIT_Faces/training-originals
其他: 兴趣+坚持
1.创建主函数main
包含OpenCV头文件
#include <opencv2/opencv.hpp>
创建一个Mat类型的vector向量,用于存放图像库缓存,
打开文件路径获取图片
struct dirent *ptr;
DIR *dir;
vector<Mat> images;
string FileName;
string PATH = "../image/MIT-faces/training-originals/";
dir=opendir(PATH.c_str());
cout << "upload image" << endl;
while((ptr=readdir(dir))!=NULL)
{
if(ptr->d_name[0] == '.')
continue;
FileName = ptr->d_name;
Mat dst = imread(PATH + FileName, 0 );
Mat image_buf = Mat::zeros(dst.rows / 5 , dst.cols / 5, CV_8UC1); //输出图像大小 512*512 pix
resize(dst, image_buf, image_buf.size(), 0, 0, INTER_LINEAR);
if ( !image_buf.data )
{
printf("No image data \n");
continue;
}
imshow(ptr->d_name, image_buf);
images.push_back(image_buf);
waitKey(30);
}
程序模块分析:
struct dirent *ptr;
DIR *dir;
vector<Mat> images;
string FileName;
string PATH = "../image/MIT-faces/training-originals/";
dir=opendir(PATH.c_str());
cout << "upload image" << endl;
创建图像缓存、文件路径、文件名,用于打开读取文件
while((ptr=readdir(dir))!=NULL)
{
if(ptr->d_name[0] == '.')
continue;
FileName = ptr->d_name;
遍历文件,判断文件名是否合法
Mat dst = imread(PATH + FileName, 0 );
Mat image_buf = Mat::zeros(dst.rows / 5 , dst.cols / 5, CV_8UC1); //输出图像大小 512*512 pix
读取图片并创建图片输出缓存
resize(dst, image_buf, image_buf.size(), 0, 0, INTER_LINEAR);
图像缩放
if ( !image_buf.data )
{
printf("No image data \n");
continue;
}
imshow(ptr->d_name, image_buf);
images.push_back(image_buf);
waitKey(30);
显示图片,将图片推入向量空间