opencv,图片遍历
//肤色提取,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,图片遍历的更多相关文章
- 基于opencv图片切割
基于opencv图片切割为n个3*3区块 工作原因,切割图片,任务急,暂留调通的源码,留以后用. package com.rosetta.image.test; import org.opencv.c ...
- Opencv图片明暗处理
Opencv图片明暗处理 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; usin ...
- Python OpenCV图片转视频 工具贴(三)
Python OpenCV图片转视频 粘贴即用,注意使用时最好把自己的文件按照数字顺序命名.按照引导输入操作. # 一键傻瓜式引导图片串成视频 # 注意使用前最好把文件命名为数字顺序格式 import ...
- opencv——图像遍历以及像素操作
摘要 我们在图像处理时经常会用到遍历图像像素点的方式,在OpenCV中一般有四种图像遍历的方式,在这里我们通过像素变换的点操作来实现对图像亮度和对比度的调整. 补充: 图像变换可以看成 像素变换--点 ...
- OpenCV快速遍历矩阵元素方法
OpenCV中Mat矩阵data数据的存储方式和二维数组不一致,二维数组按照行优先的顺序依次存储,而Mat中还有一个标示行步进的变量Step.使用Mat.ptr<DataTyte>(row ...
- OpenCV图片类cv::Mat和QImage之间进行转换(好多相关文章)
在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...
- OpenCV图片矩阵操作相关,对png图片操作(多通道)
文献链接: http://www.cnblogs.com/tornadomeet/archive/2012/12/26/2834336.html 下面这个高手,写了个小程序我还没有调试,回头 调试看看 ...
- opencv实现遍历文件夹下所有文件
前言 最近需要将视频数据集中的每个视频进行分割,分割成等长的视频片段,前提是需要首先遍历数据集文件夹中的所有视频. 实现 1.了解opencv中的Directory类: 2.实现测试代码: 系统环境 ...
- opencv图片转幻灯片视频
/*g++ *.cpp `pkg-config --cflags --libs opencv` -std=c++11*/ #include <opencv2/opencv.hpp> usi ...
随机推荐
- phpunit测试学习 1:一点简单的扼要有用的东西的总结 一点入门认识
16:45 2015/12/8phpunit测试学习 1:一点简单的扼要有用的东西的总结 一点入门认识 具体的入门安装和入门实践请参照文中的推荐博客或网上其他博客推荐博客,我感觉这几篇博客写得很不错 ...
- 封装ajax
function ajaxRequest(method,url,sync,param,responseFun){ //创建对象 var httpRequest; if(window.XMLHttpRe ...
- js中addEventListener中第3个参数
addEventListener中的第三个参 数是useCapture, 一个bool类型.当为false时为冒泡获取(由里向外),true为capture方式(由外向里). <div id=& ...
- 【Alpha】Daily Scrum Meeting第八次
一.本次Daily Scrum Meeting主要内容 抓紧冲刺(接下去两天都在下午增加一个小会议) 剩余任务的概况 二.项目进展 学号尾数 今日已完成任务 接下去要做 502 无 将数据库的数据转换 ...
- ThinkPHP 错误: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'
在配置了ThinkPHP 的数据库配置信息后,在实例化Model(),调用相关方法时候 出现错误,改进如下方式后解决: 找到php.ini 的文件,打开扩展 php_pdo_mysql.dll ,然 ...
- 下载php扩展笔记
查找相关php的扩展网址https://pecl.php.net/index.php PECL 的全称是 The PHP Extension Community Library ,即PHP 扩展库.是 ...
- Vuforia判断当识别追踪的对象
方法一,如果有多个识别对象,在Update中循环识别对象数组,获取TrackableBehaviour组件 foreach (var item in trackObjects) { var mTrac ...
- jQuery触发a标签点击事件-为什么不跳转
今天开发发现 使用jQuery触发a标签的点击事件,当前的样式发生了变化,可是没有跳转,为什么? 百度后找到的解决方案: <a onclick="hanle()" href= ...
- Mysql5.7修改默认密码
由于 Mysql5.7的默认密码是随机生成的,所以需要修改成我们自己常用的密码 1.修改 my.ini,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 my ...
- 关于type erasure
哇,好久没有写blog了,再不写的话,blog的秘密都要忘记了,嘿嘿. 最近在试着参与一个开源项目,名字叫avim(A Vibrate IM),别想多了哟.地址是:https://github.com ...