睜眼 閉眼 眯眼檢測演算法
阿新 • • 發佈:2018-11-08
睜眼 閉眼 眯眼檢測演算法
功能:
能夠實現迴圈的讀入一連串連續的影象,影象的下標一定要連續!然後讀入影象進行一些列的處理,具體什麼操作看程式碼!然後對虹膜影象進行霍夫圓畫圖操作,看是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資料夾中:
這樣,虹膜影象的睜眼閉眼眯眼就算成功了。