【肤色检测(II)】Mat版

简介:

将之前写的 (I) 中的内容改成了 Mat 版本:


//opencv2.0风格

#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;


void whThresholdOtsu(Mat &src, Mat &dst)
{
	int height=src.rows;
	int width=src.cols;

	//histogram
	float histogram[256]={0};
	for(int i=0;i<height;i++) {
		unsigned char* p=(unsigned char*)src.data+src.step*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;
		}
	}

	cv::threshold( src, dst, threshold, 255, THRESH_BINARY);
}

void cvSkinOtsu(Mat &src, Mat &dst)
{
	Mat ycrcb;
	Mat cr;
	cvtColor(src,ycrcb,CV_BGR2YCrCb);

	//show ycrcb, test
	//imshow("ycrcb",ycrcb);

	vector<Mat> mv;
	split(ycrcb,mv);

	whThresholdOtsu(mv[1],cr);
	imshow("out2",cr);

	//cvWaitKey(0);

	dst = cr.clone();
}


int main()
{
	Mat img = imread("mmr.jpg");

	//out用以保存输出图像
	Mat out;

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

	cvWaitKey(0);

	return 0;
}




相关文章
|
4月前
|
存储 编译器 计算机视觉
cv::Mat
cv::Mat
27 3
|
3月前
|
存储 算法 API
OpenCV 3.1.0中的Mat对象使用
OpenCV 3.1.0中的Mat对象使用
19 2
|
4月前
|
计算机视觉 Python
cv2.polylines
cv2.polylines
195 1
|
4月前
|
存储 定位技术 计算机视觉
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
|
4月前
|
机器学习/深度学习
RuntimeError mat1 and mat2 shapes cannot be multiplied
RuntimeError mat1 and mat2 shapes cannot be multiplied
394 0
|
SQL Java Android开发
Mat使用详解
Mat使用详解
|
API C语言 计算机视觉
三天学会opencv(三)——Mat对象
三天学会opencv(三)——Mat对象
128 0
三天学会opencv(三)——Mat对象
|
存储 计算机视觉
OpenCV之Mat
OpenCV之Mat
|
计算机视觉