/**
* Real Time Eye Tracking and Blink Detection with OpenCV
*
* @author Nash <me@nashruddin.com>
* @license GPL
* @website http://nashruddin.com
*
* See the tutorial at
* http://nashruddin.com/Real_Time_Eye_Tracking_and_Blink_Detection
*/
#include <stdio.h>
#include "cv.h"
#include "highgui.h"
#pragma comment(lib,"highgui.lib")
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
void GetColor();
int GetFace();
void GetCup();
int main(int argc, char** argv)
{
//GetColor(img);
//GetFace(img);
GetCup();
cvWaitKey(0);
system("pause");
return 0;
}
void GetCup()
{
cvNamedWindow("GetCup",CV_WINDOW_AUTOSIZE);
IplImage *img1=cvLoadImage("img1.jpg");
IplImage *img2=cvLoadImage("img2.jpg");
IplImage *diff=cvCreateImage(cvSize(img1->width,img1->height),img1->depth,img1->nChannels);
cvSub(img1,img2,diff);///背景差
IplImage *gray=cvCreateImage(cvSize(img1->width,img1->height),8,1);
cvCvtColor(diff,gray,CV_BGR2GRAY);//转化为8位灰度
cvThreshold(gray,gray,32,255, CV_THRESH_BINARY);//二值化
IplConvKernel* kernel;
kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS, NULL);
cvMorphologyEx(gray,gray,NULL,kernel,CV_MOP_OPEN,7);///开运算
/////////////////////////////////////////查找最大面积轮廓
CvMemStorage* storage;
CvSeq* comp=0;
storage = cvCreateMemStorage(0);
cvFindContours(gray,storage,&comp,sizeof(CvContour));
double maxArea=0;
CvRect maxRect;
maxRect.x=0;
maxRect.y=0;
maxRect.width=0;
maxRect.height=0;
for(;comp != 0;)
{
double area=fabs(cvContourArea(comp));
if(area>maxArea)
{
CvRect r=cvBoundingRect(comp,1);
maxRect.x=r.x;
maxRect.y=r.y;
maxRect.width=r.width;
maxRect.height=r.height;
}
comp=comp->h_next;
}
////画矩形
// CvPoint a,c;
// a.x=maxRect.x;
// a.y=maxRect.y;
// c.x=maxRect.x+maxRect.width;
// c.y=maxRect.y+maxRect.height;
// cvRectangle(img2,a,c,CV_RGB(255,0,0),2,8);
/////////////////////////////////////////////////面积最大区域 复制
cvSetImageROI(img2,maxRect);
IplImage *maxAreaImg;
maxAreaImg=cvCreateImage(cvSize(maxRect.width,maxRect.height),8,3);
cvCopy(img2,maxAreaImg);
cvResetImageROI(img2);
////////////////////////////////漫水法颜色填充
CvPoint seedPoint;
seedPoint.x=0;
seedPoint.y=0;
CvScalar newVal;
newVal.val[0]=0;
newVal.val[1]=0;
newVal.val[2]=0;
CvScalar loDiff = cvScalarAll(2);
CvScalar upDiff = cvScalarAll(203);
cvNamedWindow("GetCup2",CV_WINDOW_AUTOSIZE);
cvShowImage("GetCup2",img2);
CvConnectedComp conComp;
cvFloodFill(img2,seedPoint,newVal,loDiff,upDiff,&conComp);///漫水法填充,并返回区域轮廓
CvPoint a,b;
a.x=conComp.rect.x;
a.y=conComp.rect.y;
b.x=conComp.rect.x+conComp.rect.width;
b.y=conComp.rect.y+conComp.rect.height;
cvRectangle(img2,a,b,CV_RGB(255,0,0),2,8);
cvShowImage("GetCup",img2);
///////////////////////////////////////
}
int GetFace()
{
IplImage *img=cvLoadImage("face.jpg");
cvNamedWindow("testF", CV_WINDOW_AUTOSIZE);
cvNamedWindow("testF2", CV_WINDOW_AUTOSIZE);
cvNamedWindow("testF3", CV_WINDOW_AUTOSIZE);
IplImage *img2;
img2=cvCreateImage(cvSize(img->width,img->height),img->depth,img->nChannels);
img2=cvCloneImage(img);
CvSeq* comp=0;
CvMemStorage* storage;
storage = cvCreateMemStorage(0);
CvSeq* comp2=0;
CvMemStorage* storage2;
storage2 = cvCreateMemStorage(0);
IplConvKernel* kernel;
kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS, NULL);
if (!storage)
printf("cannot allocate memory storage!");
IplImage* _diff;
IplImage* diff;
diff=cvCreateImage(cvSize(img->width,img->height),img->depth,1);
cvCvtColor(img,diff,CV_BGR2GRAY);//灰度图
cvThreshold(diff,diff, 127, 255, CV_THRESH_BINARY); //二值化
cvShowImage("testF",diff);
cvMorphologyEx(diff, diff, NULL, kernel, CV_MOP_OPEN, 7);//闭运算
_diff = cvCloneImage(diff);
int nface=cvFindContours(_diff, storage, &comp, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); //查轮廓
printf("%d\n",nface);
for(int i=0;comp != 0;i=i+100)
{
CvRect r = cvBoundingRect(comp, 1);
double area=fabs(cvContourArea(comp,CV_WHOLE_SEQ));
printf("%lf\n",area);
printf("width=%d height=%d\n",r.width,r.height);
CvPoint a,c;
a.x=r.x;
a.y=r.y;
c.x=r.x+r.width;
c.y=r.y+r.height;
cvRectangle(img2,a,c,CV_RGB(255,0,0),2,8);
cvShowImage("testF3",img2);
//////////////////////////////
cvSetImageROI(diff,r);
cvFindContours(diff, storage2, &comp2, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); //查轮廓
for(;comp2 != 0;)
{
CvRect r2=cvBoundingRect(comp2,1);
CvPoint a2,c2;
a2.x=r2.x+r.x;
a2.y=r2.y+r.y;
c2.x=r2.x+r2.width+r.x;
c2.y=r2.y+r2.height+r.y;
cvRectangle(img,a2,c2,CV_RGB(255,i,i/6),2,8);
cvShowImage("testF2",img);
comp2=comp2->h_next;
}
cvWaitKey(100);
cvResetImageROI(diff);
comp = comp->h_next;
}
return 0;
}
///提取颜色
void GetColor()
{
IplImage *img=cvLoadImage("face.jpg");
IplImage* pImg_test = img;
int r, g, b;
int intS = 0;
IplImage* newImg;
newImg=cvCreateImage(cvSize(img->width,img->height),img->depth,img->nChannels);
cvNamedWindow("test",CV_WINDOW_AUTOSIZE);
for(int x = 0; x < pImg_test->width; x++)
{
for(int y = 0; y < pImg_test->height; y++)
{
r = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3 + 2);
g = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3 + 1);
b = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3);
if (r >= 210)
{
CvScalar val;
val.val[0]=r;
val.val[1]=g;
val.val[2]=b;
cvSet2D(newImg,y,x,val);
}
}
}
cvShowImage("test",newImg);
printf("ok");
}