1. 程式人生 > >睜眼 閉眼 眯眼檢測演算法

睜眼 閉眼 眯眼檢測演算法

睜眼 閉眼 眯眼檢測演算法

功能:
能夠實現迴圈的讀入一連串連續的影象,影象的下標一定要連續!然後讀入影象進行一些列的處理,具體什麼操作看程式碼!然後對虹膜影象進行霍夫圓畫圖操作,看是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資料夾中:
在這裡插入圖片描述

這樣,虹膜影象的睜眼閉眼眯眼就算成功了。