同学帮改肤色检测(未完成版)

简介:

直接代码:

#include "cv.h"
#include "highgui.h"

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>

#include <iostream>
#include <string>
#include <cstdio>

using namespace std;
using namespace cv;

// implementation of otsu algorithm
// author: onezeros#yahoo.cn
// reference: Rafael C. Gonzalez. Digital Image Processing Using MATLAB
void cvThresholdOtsu(IplImage* src, IplImage* dst)
{
	int height=src->height;
	int width=src->width;


	Mat ycrcb
	double sum_Cr=0;
	for(int i=0;i < ycrcb.rows;i++){
		for(int j=0;j < ycrcb.cols;j++){
			int sky,skcr,skcb;			//三个通道的值
			sum_Cr +=  (int) ycrcb.at<Vec3b>(i,j)[1];
			
		}
	}

	//histogram
	float histogram[256]={0};
	for(int i=0;i<height;i++) {
		unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;
		for(int j=0;j<width;j++) {
			histogram[*p++]++;
		}
	}
	//normalize histogram
	int size=height*width;
	for(int i=0;i<256;i++) {
		histogram[i]=histogram[i]/size;
	}

	//average pixel value
	float avgValue=0;
	for(int i=0;i<256;i++) {
		avgValue+=i*histogram[i];
	}

	int threshold;	
	float maxVariance=0;
	float w=0,u=0;
	for(int i=0;i<256;i++) {
		w+=histogram[i];
		u+=i*histogram[i];

		float t=avgValue*w-u;
		float variance=t*t/(w*(1-w));
		if(variance>maxVariance) {
			maxVariance=variance;
			threshold=i;
		}
	}
	threshold=131;
	cout<<"threshold == "<<threshold<<endl;
	cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY);
}

void cvSkinOtsu(IplImage* src, IplImage* dst)//Mat &
{
	assert(dst->nChannels==1&& src->nChannels==3);

	IplImage* ycrcb=cvCreateImage(cvGetSize(src),8,3);
	IplImage* cr=cvCreateImage(cvGetSize(src),8,1);
	cvCvtColor(src,ycrcb,CV_BGR2YCrCb);//cvtColor
	//show ycrcb
	cvShowImage("ycrcb",ycrcb);

	//vector<Point> mv[3]; 
	//split(ycrcb , mv);

	cvSplit(ycrcb,0,cr,0,0);//split

	cvThresholdOtsu(cr,cr);
	cvShowImage("out2",cr);//show

	cvSaveImage("out.jpg",cr);//imwrite

	//cvWaitKey(0);
	//cvCopyImage(cr,dst);

	//cvReleaseImage(&cr);
	cvReleaseImage(&ycrcb);
}


int main()
{
	IplImage* img = cvLoadImage( "zcr.jpg" );
	//out用以保存输出图像
	/*IplImage * out = cvCreateImage(
		cvGetSize(img),
		IPL_DEPTH_8U,
		3
	);*/

	IplImage * out;

	cvShowImage("in",img);
	cvSkinOtsu(img,out);
	//cvShowImage("out",out);

	cvWaitKey(0);

	cvReleaseImage(&img);//用完清理
	//cvReleaseImage(&out);//用完清理
	cvDestroyWindow("in");
	cvDestroyWindow("out");

	return 0;
}




相关文章
|
3月前
新人,为什么你提问了却得不到想要的答案?
新人,为什么你提问了却得不到想要的答案?
|
6月前
|
消息中间件 前端开发 NoSQL
考研失败如何快速找到编程工作?
考研失败如何快速找到编程工作?
52 3
|
安全 网络协议 Java
【紧急】Log4j又发新版2.17.0,只有彻底搞懂漏洞原因,才能以不变应万变,小白也能看懂
经过一周时间的Log4j2 RCE事件的发酵,事情也变也越来越复杂和有趣,就连 Log4j 官方紧急发布了 2.15.0 版本之后没有过多久,又发声明说 2.15.0 版本也没有完全解决问题,然后进而继续发布了 2.16.0 版本。大家都以为2.16.0是最终终结版本了,没想到才过多久又爆雷,Log4j 2.17.0横空出世。
611 0
关于临时HY学长被安排拉二分题不想翻译找到DYM学长这件事(三)
关于临时HY学长被安排拉二分题不想翻译找到DYM学长这件事(三)
69 0
|
人工智能
关于临时HY学长被安排拉二分题不想翻译找到DYM学长这件事(二)
关于临时HY学长被安排拉二分题不想翻译找到DYM学长这件事(二)
75 0
关于临时HY学长被安排拉二分题不想翻译找到DYM学长这件事
关于临时HY学长被安排拉二分题不想翻译找到DYM学长这件事
62 0
|
监控 安全 架构师
抱歉,你测试的项目上线之后bug太多了!
抱歉,你测试的项目上线之后bug太多了!
|
资源调度 分布式计算 数据可视化
一看就懂!任务提交的资源判断在Taier中的实践
根据环境资源的剩余情况来动态调整提交任务的速率是Taier必不可少的一项功能,那么Taier究竟是怎么来判断资源的呢?本文就为大家详细聊聊任务提交的资源判断在Taier中的实践。对该话题感兴趣的朋友千万别错过~
146 0
一看就懂!任务提交的资源判断在Taier中的实践
|
前端开发
前端工作小结76-整理订单的重置逻辑
前端工作小结76-整理订单的重置逻辑
80 0
前端工作小结76-整理订单的重置逻辑
express学习42-多人管理33修改2(未能完结
express学习42-多人管理33修改2(未能完结
53 0
express学习42-多人管理33修改2(未能完结