fsgl.cpp
上传用户:likuei778
上传日期:2022-07-12
资源大小:1361k
文件大小:2k
源码类别:

2D图形编程

开发平台:

Visual C++

  1. #include <cv.h>
  2. #include <highgui.h>
  3. #include<iostream.h>
  4. #pragma comment (lib, "cxcore.lib") 
  5. #pragma comment (lib, "cv.lib")  
  6. #pragma comment (lib, "highgui.lib")    
  7. int main(int argc, char *argv[])
  8. {
  9. IplImage* img = 0; // 原图
  10. IplImage* dst_img;//ycbcr图
  11. IplImage* dst;//肤色图
  12. char *name="test.bmp";
  13. img=cvLoadImage(name,1); //加载图像
  14. dst=cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,1);
  15. dst_img=cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,3);
  16. int height,width,step,channels;
  17. uchar *data;
  18. height = dst_img->height;
  19. width = dst_img->width;
  20. step = dst_img->widthStep;
  21. channels = dst_img->nChannels;
  22. data = (uchar *)dst_img->imageData;
  23. cvCvtColor(img, dst_img, CV_BGR2YCrCb);// rgb->ycrcb
  24. double c[4]={0.0077 ,-0.0041,-0.0041 ,0.0047};//(肤色)协方差矩阵求逆后
  25. CvMat* max=cvCreateMat(height,width,CV_64FC1);//存储肤色概率密度矩阵(数组)
  26. CvMat* mat=cvCreateMat(2,2,CV_64FC1);//存储协方差矩阵(逆)
  27. CvMat* a=cvCreateMat(1,2,CV_64FC1);//{cb,cr}
  28. CvMat* a1=cvCreateMat(2,1,CV_64FC1);//{cb,cr}转至
  29. CvMat* res=cvCreateMat(1,1,CV_64FC1);
  30. cvInitMatHeader(mat,2,2,CV_64FC1,c);
  31. double res1[1]={0};
  32. cvInitMatHeader(res,1,1,CV_64FC1,res1);
  33. cvNamedWindow("rgb", CV_WINDOW_AUTOSIZE);
  34. cvNamedWindow("肤色", CV_WINDOW_AUTOSIZE);
  35. int i,j;
  36. double b,r,cb,cr,u;
  37. for(i=0;i<height;i++) for(j=0;j<width;j++)
  38. {
  39. b=data[i*step+j*channels+2];//cb 分量
  40. r=data[i*step+j*channels+1];//cr 分量
  41. cb=b-103.0056;//
  42. cr=r-140.1309;//
  43. double p1[2]={cb,cr};
  44. cvInitMatHeader(a,1,2,CV_64FC1,p1);
  45. cvMatMulAdd(a,mat,0,a);
  46. cvInitMatHeader(a1,2,1,CV_64FC1,p1);
  47. cvMatMulAdd(a,a1,0,res);
  48. u=CV_MAT_ELEM(*res,double,0,0);
  49. u=exp(-0.5*u);
  50. cvmSet(max,i,j,u);
  51. }
  52. double max1=0; //初始化最大值
  53. double mm=0;
  54. cvMinMaxLoc(max,NULL,&max1,NULL,NULL);
  55. // 肤色似然度
  56. for(i=0;i<height;i++) for(j=0;j<width;j++)
  57. {
  58. mm=CV_MAT_ELEM(*max,double,i,j)/max1;
  59. cvmSet(max,i,j,mm);
  60. ((dst->imageData + dst->widthStep*i))[j]=255*mm;
  61. }
  62. //cvSmooth( dst, dst,CV_MEDIAN,3, 0, 0 );//中值滤波
  63. cvThreshold(dst,dst,250,255,CV_THRESH_BINARY);
  64. cvShowImage("rgb", img );
  65. cvShowImage("肤色", dst );
  66. cvSaveImage("1.jpg",dst);
  67. cvWaitKey(0);
  68. cvReleaseImage(&img );
  69. return 0;
  70. }