//肤色提取,skinArea为二值化肤色图像
void skinExtract(const Mat &frame, Mat &skinArea)
{
Mat YCbCr;
vector<Mat> planes; //转换为YCrCb颜色空间
cvtColor(frame, YCbCr, CV_RGB2YCrCb); //将多通道图像分离为多个单通道图像
split(YCbCr, planes);
skinArea.create(YCbCr.size(), planes[1].type());
//人的皮肤颜色在YCbCr色度空间的分布范围:100<=Cb<=127, 138<=Cr<=170
int Cols = frame.cols;
for (int r = 0; r < frame.rows; r++){
const uchar* Cb = planes[1].ptr<uchar>(r);
const uchar* Cr = planes[2].ptr<uchar>(r);
uchar* data = skinArea.ptr<uchar>(r);
for (int c = 0; c < Cols; c++)
{
if (100 <= Cb[c] && Cb[c] <= 127 && 138 <= Cr[c] && Cr[c] <= 170)
{
data[c] = 0;
}
else{
data[c] = 255;
}
} } //膨胀和腐蚀,膨胀可以填补凹洞(将裂缝桥接),腐蚀可以消除细的凸起(“斑点”噪声) //dilate(skinArea, skinArea, Mat(3, 3, CV_8UC1), Point(-1, -1));
//erode(skinArea, skinArea, Mat(3, 3, CV_8UC1), Point(-1, -1));
//blur(skinArea, skinArea, cvSize(2, 2));
//erode(skinArea, skinArea,cv::Mat());
}
//肤色提取
double skinExtract(const IplImage *pFrame)
{
IplImage *pYCbCr = cvCreateImage(cvGetSize(pFrame), 8, 3);;
IplImage *pCb = cvCreateImage(cvGetSize(pFrame), 8, 1);
IplImage *pCr = cvCreateImage(cvGetSize(pFrame), 8, 1); cv::vector<IplImage*> planes; //转换成YCrCb颜色空间
cvCvtColor(pFrame, pYCbCr, CV_RGB2YCrCb);
//把多通道图像分离为单通道图像
cvSplit(pYCbCr, 0, pCb, pCr, 0);
//Cb[100,127] Cr[138,170]
long area = pYCbCr->height * pYCbCr->width;
long skin = 0;
for (int h = 0; h < pYCbCr->height; h++){
unsigned char *strCb = (unsigned char*)pCb->imageData + h*pCb->widthStep;
unsigned char *strCr = (unsigned char*)pCr->imageData + h*pCr->widthStep;
for (int w = 0; w < pYCbCr->width; w++){
if (strCb[w]>100 && strCb[w]<127 && (int)strCr[w]>138 && (int)strCr[w] < 170){
skin++;
}
}
} /*
cvErode(skinFrame, skinFrame, NULL, 1); //腐蚀
//cvDilate(skinFrame, skinFrame, NULL, 2); //膨胀
cvSmooth(skinFrame, skinFrame, CV_BLUR, 3, 3, 0, 0);
//cvShowImage("dst1", skinFrame);
*/
cvReleaseImage(&pYCbCr);
cvReleaseImage(&pCb);
cvReleaseImage(&pCr);
return skin*1.0 / area;
}

opencv,图片遍历的更多相关文章

  1. 基于opencv图片切割

    基于opencv图片切割为n个3*3区块 工作原因,切割图片,任务急,暂留调通的源码,留以后用. package com.rosetta.image.test; import org.opencv.c ...

  2. Opencv图片明暗处理

    Opencv图片明暗处理 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; usin ...

  3. Python OpenCV图片转视频 工具贴(三)

    Python OpenCV图片转视频 粘贴即用,注意使用时最好把自己的文件按照数字顺序命名.按照引导输入操作. # 一键傻瓜式引导图片串成视频 # 注意使用前最好把文件命名为数字顺序格式 import ...

  4. opencv——图像遍历以及像素操作

    摘要 我们在图像处理时经常会用到遍历图像像素点的方式,在OpenCV中一般有四种图像遍历的方式,在这里我们通过像素变换的点操作来实现对图像亮度和对比度的调整. 补充: 图像变换可以看成 像素变换--点 ...

  5. OpenCV快速遍历矩阵元素方法

    OpenCV中Mat矩阵data数据的存储方式和二维数组不一致,二维数组按照行优先的顺序依次存储,而Mat中还有一个标示行步进的变量Step.使用Mat.ptr<DataTyte>(row ...

  6. OpenCV图片类cv::Mat和QImage之间进行转换(好多相关文章)

    在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...

  7. OpenCV图片矩阵操作相关,对png图片操作(多通道)

    文献链接: http://www.cnblogs.com/tornadomeet/archive/2012/12/26/2834336.html 下面这个高手,写了个小程序我还没有调试,回头 调试看看 ...

  8. opencv实现遍历文件夹下所有文件

    前言 最近需要将视频数据集中的每个视频进行分割,分割成等长的视频片段,前提是需要首先遍历数据集文件夹中的所有视频. 实现 1.了解opencv中的Directory类: 2.实现测试代码: 系统环境 ...

  9. opencv图片转幻灯片视频

    /*g++ *.cpp `pkg-config --cflags --libs opencv` -std=c++11*/ #include <opencv2/opencv.hpp> usi ...

随机推荐

  1. 朋友圈常见单页面触屏滑动上下翻屏功能jQuery实现

    翻页插件:实现原理,用margin-top来控制页面容器位置来实现上下翻页.margin这属性很好用,可以用来制作侧栏动画滑出菜单(左菜单,右内容,控制两者的margin实现):或者head下滑菜单 ...

  2. jQuery的.bind()、.live()和.delegate()之间区别

    摘要:jQuery的.bind()..live()和.delegate()之间的区别并非总是那么明显的,然而,如果我们对所有的不同之处都有清晰的理解的话,那么这将会有助于我们编写出更加简洁的代码,以及 ...

  3. Leetcode Distinct Subsequences

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  4. Xamarin的不归路-生成安卓错误

    编译生成安卓时提示错误 解决方案:删掉此文件夹(C:\Users\***\AppData\Local\Xamarin\)内所以文件夹和文件,再FQ重新编译即可. 2016年9月1日 13:33

  5. HDU3371 最小生成树

    Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  6. HDU2527 哈夫曼编码

    Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. CSS实现元素水平/垂直居中的方法

    首先,我们来了解水平居中,它有很多种方法,我们暂时先来了解其中的几种: 1.    在实现方案中,我们最熟悉的莫过于给元素定义一个宽度,然后使用margin: 1 2 3 4 body{     wi ...

  8. javascript平时小例子⑨(小型抽奖功能)

    <!doctype html><html lang="en"> <head> <meta charset="utf-8" ...

  9. C fread

    fread是一个函数.从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功返回 0. 函数原型 size_t fread ( void ...

  10. sun公司的jstl标签库

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...