睁眼 闭眼 眯眼检测算法
功能:
能够实现循环的读入一连串连续的图像,图像的下标一定要连续!然后读入图像进行一些列的处理,具体什么操作看代码!然后对虹膜图像进行霍夫圆画图操作,看是1.5的反比能画霍夫圆还是2的时候能够画霍夫圆,检测i=1还是i=0或者i大于1 判断画了几条霍夫圆,从而判断出来是闭眼还是睁眼,还是眯眼! 然后把检测的图像进行保存,分别把闭眼眯眼睁眼的虹膜图像保存在文件中,下标从1开始递增。
代码如下:
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <sstream>
#include <stdlib.h>
#include <vector>
#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat midImage,dstImage,edge;
char buffer[200];
//char imgPath[200] ;
int radius=0;
int k=1;
int m=1;
int n=1;
for(int j=1;j<8;j++)//通过for循环对每个图片 霍夫圆检测
{
int i=0;
//sprintf函数的功能与printf函数的功能基本一样,只是它把结果输出到指定的字符串中了
//sprintf(buffer,"%d.bmp",j);
sprintf(buffer,"C:\\Iris1\\%d.bmp",j);
//strcpy(imgPath,buffer); //strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。
//printf("%s",imgPath);
Mat srcImage = imread(buffer);
threshold(srcImage, srcImage, 30, 200.0, CV_THRESH_BINARY);//二值化
cvtColor(srcImage,midImage,COLOR_BGR2GRAY);
blur(midImage,edge,Size(3,3));
Canny(edge,edge,3,9,3);
GaussianBlur(midImage,midImage,Size(9,9),2,2);
vector<Vec3f> circles;
HoughCircles(midImage,circles,CV_HOUGH_GRADIENT,1.5,10,200,100,0,0); //1.5 反比
for( i=0;i<circles.size();i++)
{
Point center(cvRound(circles[i][0]),cvRound(circles[i][1]));
radius=cvRound(circles[i][2]);
circle(srcImage,center,3,Scalar(0,255,0),-1,8,0);
circle(srcImage,center,radius,Scalar(155,50,255),3,8,0);
}
printf("\t");
if(i>=1)
{
printf("睁眼");
imshow("效果图",srcImage);
printf("\n");
waitKey(500);
stringstream ss;
ss<<k;
string saveimagename="C:\\NULL1\\"+ss.str()+".bmp";
imwrite(saveimagename,srcImage );
k++;
}
else
{
vector<Vec3f> circles;
HoughCircles(midImage,circles,CV_HOUGH_GRADIENT,2,10,200,100,0,0); //2 反比 代表是二分之一 也就是图像的一半
for( i=0;i<circles.size();i++)
{
Point center(cvRound(circles[i][0]),cvRound(circles[i][1]));
radius=cvRound(circles[i][2]);
circle(srcImage,center,3,Scalar(0,255,0),-1,8,0);
circle(srcImage,center,radius,Scalar(155,50,255),3,8,0);
}
if(i>=1)
{
printf("咪眼");
imshow("效果图",srcImage);
printf("\n");
waitKey(500);
stringstream ss;
ss<<m;
string saveimagename="C:\\NULL2\\"+ss.str()+".bmp";
imwrite(saveimagename,srcImage );
m++;
}
else{
printf("闭眼");
imshow("效果图",srcImage);
printf("\n");
waitKey(500);
stringstream ss; //定义一个字符串流
ss<<n; //赋值 写入
string saveimagename="C:\\NULL3\\"+ss.str()+".bmp"; //字符流的str()操作 把字符流中的整数输出
imwrite(saveimagename,srcImage );
n++;
}
}
}
return 0;
}
结果如下:
新建三个文件夹:
在Iris1文件夹中存储的七张虹膜图像待处理,下标需要连续!
运行时候的效果图!
结果: 看文件夹中有没有保存成功。
NILL1文件夹中:
NILL2文件夹中:
NILL3文件夹中:
这样,虹膜图像的睁眼闭眼眯眼就算成功了。