- 浏览: 413865 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
yan789654100:
先谢谢了,去研究一下
Java网络围棋游戏源码含大厅,仿QQ游戏 -
dan0773:
火狐里面用不了
梅花雨日历控件源码,及应用实例 -
左手边:
挺好的不错
Velocity教程 -
liuxuejin:
既然是教程,连个例子都没有!顶多是个笔记而已
Velocity教程 -
sky_pearl:
泪奔……求大厅代码!!!
Java网络围棋游戏源码含大厅,仿QQ游戏
OpenCV背景去除的几种方法(转)
- 博客分类:
- 技术文章
1、肤色侦测法
肤色提取是基于人机互动方面常见的方法。因为肤色是人体的一大特征,它可以迅速从复杂的背景下分离出自己的特征区域。一下介绍两种常见的肤色提取:
(1)HSV空间的肤色提取
HSV色彩空间是一个圆锥形的模型,具体如右图所示:
色相(H)是色彩的基本属性,就是平常说的颜色名称,例如红色、黄色等.
依照图的标准色轮上的位置,取360度得数值。(也有0~100%的方法确定) 饱和度(S)是色彩的纯度,越高色彩越纯,低则变灰。取值为0~100%。明度(V)也叫亮度,取值0~100。
根据肤色在HSV三个分量上的值,就可以简单的侦测出一张图像上肤色的部分。一下是肤色侦测函数的源代码:
void skinDetectionHSV(IplImage* pImage,int lower,int upper,IplImage* process) { IplImage* pImageHSV = NULL; IplImage* pImageH = NULL; IplImage* pImageS = NULL; IplImage* pImageProcessed = NULL; IplImage* tmpH = NULL; IplImage* tmpS = NULL; static IplImage* pyrImage = NULL; CvSize imgSize; imgSize.height = pImage->height; imgSize.width = pImage->width ; //create you want to use image and give them memory allocation pImageHSV = cvCreateImage(imgSize,IPL_DEPTH_8U,3); pImageH = cvCreateImage(imgSize,IPL_DEPTH_8U,1); pImageS = cvCreateImage(imgSize,IPL_DEPTH_8U,1); tmpS = cvCreateImage(imgSize,IPL_DEPTH_8U,1); tmpH = cvCreateImage(imgSize,IPL_DEPTH_8U,1); pImageProcessed = cvCreateImage(imgSize,IPL_DEPTH_8U,1); pyrImage = cvCreateImage(cvSize(pImage->width/2,pImage->height/2),IPL_DEPTH_8U,1); //convert RGB image to HSV image cvCvtColor(pImage,pImageHSV,CV_BGR2HSV); //Then split HSV to three single channel images cvCvtPixToPlane(pImageHSV,pImageH,pImageS,NULL,NULL); //The skin scalar range in H and S, Do they AND algorithm cvInRangeS(pImageH,cvScalar(0.0,0.0,0,0),cvScalar(lower,0.0,0,0),tmpH); cvInRangeS(pImageS,cvScalar(26,0.0,0,0),cvScalar(upper,0.0,0,0),tmpS); cvAnd(tmpH,tmpS,pImageProcessed,0); // //cvPyrDown(pImageProcessed,pyrImage,CV_GAUSSIAN_5x5); //cvPyrUp(pyrImage,pImageProcessed,CV_GAUSSIAN_5x5); //Erode and dilate cvErode(pImageProcessed,pImageProcessed,0,2); cvDilate(pImageProcessed,pImageProcessed,0,1); cvCopy(pImageProcessed,process,0); //do clean cvReleaseImage(&pyrImage); cvReleaseImage(&pImageHSV); cvReleaseImage(&pImageH); cvReleaseImage(&pImageS); cvReleaseImage(&pyrImage); cvReleaseImage(&tmpH); cvReleaseImage(&tmpS); cvReleaseImage(&pImageProcessed); }(2)YCrCb空间的肤色提取
YCrCb也是一种颜色空间,也可以说是YUV的颜色空间。Y是亮度的分量,而肤色侦测是对亮度比较敏感的,由摄像头拍摄的RGB图像转化为YCrCb空间的话可以去除亮度对肤色侦测的影响。下面给出基于YCrCb肤色侦测函数的源代码:
void skinDetectionYCrCb(IplImage* imageRGB,int lower,int upper,IplImage* imgProcessed) { assert(imageRGB->nChannels==3); IplImage* imageYCrCb = NULL; IplImage* imageCb = NULL; imageYCrCb = cvCreateImage(cvGetSize(imageRGB),8,3); imageCb = cvCreateImage(cvGetSize(imageRGB),8,1); cvCvtColor(imageRGB,imageYCrCb,CV_BGR2YCrCb); cvSplit(imageYCrCb,0,0,imageCb,0);//Cb for (int h=0;h<imageCb->height;h++) { for (int w=0;w<imageCb->width;w++) { unsigned char* p =(unsigned char*)(imageCb->imageData+h*imageCb->widthStep+w); if (*p<=upper&&*p>=lower) { *p=255; } else { *p=0; } } } cvCopy(imageCb,imgProcessed,NULL); }2、基于混合高斯模型去除背景法
高斯模型去除背景法也是背景去除的一种常用的方法,经常会用到视频图像侦测中。这种方法对于动态的视频图像特征侦测比较适合,因为模型中是前景和背景分离开来的。分离前景和背景的基准是判断像素点变化率,会把变化慢的学习为背景,变化快的视为前景。
// #include "stdafx.h" #include "cv.h" #include "highgui.h" #include "cxtypes.h" #include "cvaux.h" # include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { //IplImage* pFirstFrame = NULL; IplImage* pFrame = NULL; IplImage* pFrImg = NULL; IplImage* pBkImg = NULL; IplImage* FirstImg = NULL; static IplImage* pyrImg =NULL; CvCapture* pCapture = NULL; int nFrmNum = 0; int first = 0,next = 0; int thresh = 0; cvNamedWindow("video",0); //cvNamedWindow("background",0); cvNamedWindow("foreground",0); cvResizeWindow("video",400,400); cvResizeWindow("foreground",400,400); //cvCreateTrackbar("thresh","foreground",&thresh,255,NULL); //cvMoveWindow("background",360,0); //cvMoveWindow("foregtound",0,0); if(!(pCapture = cvCaptureFromCAM(1))) { printf("Could not initialize camera , please check it !"); return -1; } CvGaussBGModel* bg_model = NULL; while(pFrame = cvQueryFrame(pCapture)) { nFrmNum++; if(nFrmNum == 1) { pBkImg = cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,3); pFrImg = cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1); FirstImg = cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1); pyrImg = cvCreateImage(cvSize(pFrame->width/2,pFrame->height/2),IPL_DEPTH_8U,1); CvGaussBGStatModelParams params; params.win_size = 2000; //Learning rate = 1/win_size; params.bg_threshold = 0.7; //Threshold sum of weights for background test params.weight_init = 0.05; params.variance_init = 30; params.minArea = 15.f; params.n_gauss = 5; //= K =Number of gaussian in mixture params.std_threshold = 2.5; //cvCopy(pFrame,pFirstFrame,0); bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame,¶ms); } else { int regioncount = 0; int totalNum = pFrImg->width *pFrImg->height ; cvSmooth(pFrame,pFrame,CV_GAUSSIAN,3,0,0,0); cvUpdateBGStatModel(pFrame,(CvBGStatModel*)bg_model,-0.00001); cvCopy(bg_model->foreground ,pFrImg,0); cvCopy(bg_model->background ,pBkImg,0); //cvShowImage("background",pBkImg); //cvSmooth(pFrImg,pFrImg,CV_GAUSSIAN,3,0,0,0); //cvPyrDown(pFrImg,pyrImg,CV_GAUSSIAN_5x5); //cvPyrUp(pyrImg,pFrImg,CV_GAUSSIAN_5x5); //cvSmooth(pFrImg,pFrImg,CV_GAUSSIAN,3,0,0,0); cvErode(pFrImg,pFrImg,0,1); cvDilate(pFrImg,pFrImg,0,3); //pBkImg->origin = 1; //pFrImg->origin = 1; cvShowImage("video",pFrame); cvShowImage("foreground",pFrImg); //cvReleaseBGStatModel((CvBGStatModel**)&bg_model); //bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame,0); /* //catch target frame if(nFrmNum>10 &&(double)cvSumImage(pFrImg)>0.3 * totalNum) { first = cvSumImage(FirstImg); next = cvSumImage(pFrImg); printf("Next number is :%d /n",next); cvCopy(pFrImg,FirstImg,0); } cvShowImage("foreground",pFrImg); cvCopy(pFrImg,FirstImg,0); */ if(cvWaitKey(2)== 27) { break; } } } cvReleaseBGStatModel((CvBGStatModel**)&bg_model); cvDestroyAllWindows(); cvReleaseImage(&pFrImg); cvReleaseImage(&FirstImg); cvReleaseImage(&pFrame); cvReleaseImage(&pBkImg); cvReleaseCapture(&pCapture); return 0; }3、背景相减背景去除方法
所谓的背景相减,是指把摄像头捕捉的图像第一帧作为背景,以后的每一帧都减去背景帧,这样减去之后剩下的就是多出来的特征物体(要侦测的物体)的部分。但是相减的部分也会对特征物体的灰阶值产生影响,一般是设定相关阈值要进行判断。以下是代码部分:
int _tmain(int argc, _TCHAR* argv[]) { int thresh_low = 30; IplImage* pImgFrame = NULL; IplImage* pImgProcessed = NULL; IplImage* pImgBackground = NULL; IplImage* pyrImage = NULL; CvMat* pMatFrame = NULL; CvMat* pMatProcessed = NULL; CvMat* pMatBackground = NULL; CvCapture* pCapture = NULL; cvNamedWindow("video", 0); cvNamedWindow("background",0); cvNamedWindow("processed",0); //Create trackbar cvCreateTrackbar("Low","processed",&thresh_low,255,NULL); cvResizeWindow("video",400,400); cvResizeWindow("background",400,400); cvResizeWindow("processed",400,400); cvMoveWindow("video", 0, 0); cvMoveWindow("background", 400, 0); cvMoveWindow("processed", 800, 0); if( !(pCapture = cvCaptureFromCAM(1))) { fprintf(stderr, "Can not open camera./n"); return -2; } //first frame pImgFrame = cvQueryFrame( pCapture ); pImgBackground = cvCreateImage(cvSize(pImgFrame->width, pImgFrame->height), IPL_DEPTH_8U,1); pImgProcessed = cvCreateImage(cvSize(pImgFrame->width, pImgFrame->height), IPL_DEPTH_8U,1); pyrImage = cvCreateImage(cvSize(pImgFrame->width/2, pImgFrame->height/2), IPL_DEPTH_8U,1); pMatBackground = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1); pMatProcessed = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1); pMatFrame = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1); cvSmooth(pImgFrame, pImgFrame, CV_GAUSSIAN, 3, 0, 0); cvCvtColor(pImgFrame, pImgBackground, CV_BGR2GRAY); cvCvtColor(pImgFrame, pImgProcessed, CV_BGR2GRAY); cvConvert(pImgProcessed, pMatFrame); cvConvert(pImgProcessed, pMatProcessed); cvConvert(pImgProcessed, pMatBackground); cvSmooth(pMatBackground, pMatBackground, CV_GAUSSIAN, 3, 0, 0); while(pImgFrame = cvQueryFrame( pCapture )) { cvShowImage("video", pImgFrame); cvSmooth(pImgFrame, pImgFrame, CV_GAUSSIAN, 3, 0, 0); cvCvtColor(pImgFrame, pImgProcessed, CV_BGR2GRAY); cvConvert(pImgProcessed, pMatFrame); cvSmooth(pMatFrame, pMatFrame, CV_GAUSSIAN, 3, 0, 0); cvAbsDiff(pMatFrame, pMatBackground, pMatProcessed); //cvConvert(pMatProcessed,pImgProcessed); //cvThresholdBidirection(pImgProcessed,thresh_low); cvThreshold(pMatProcessed, pImgProcessed, 30, 255.0, CV_THRESH_BINARY); cvPyrDown(pImgProcessed,pyrImage,CV_GAUSSIAN_5x5); cvPyrUp(pyrImage,pImgProcessed,CV_GAUSSIAN_5x5); //Erode and dilate cvErode(pImgProcessed, pImgProcessed, 0, 1); cvDilate(pImgProcessed, pImgProcessed, 0, 1); //background update cvRunningAvg(pMatFrame, pMatBackground, 0.0003, 0); cvConvert(pMatBackground, pImgBackground); cvShowImage("background", pImgBackground); cvShowImage("processed", pImgProcessed); //cvZero(pImgProcessed); if( cvWaitKey(10) == 27 ) { break; } } cvDestroyWindow("video"); cvDestroyWindow("background"); cvDestroyWindow("processed"); cvReleaseImage(&pImgProcessed); cvReleaseImage(&pImgBackground); cvReleaseMat(&pMatFrame); cvReleaseMat(&pMatProcessed); cvReleaseMat(&pMatBackground); cvReleaseCapture(&pCapture); return 0; }
发表评论
-
Extjs 验证使用
2012-08-10 10:16 992/** * 用户表单面板 */ Ext.def ... -
使用ext的store.load 之后然后使用store.getCount 值为零解决办法
2012-07-13 09:12 1229使用ext的store.load(),之后然后使用store. ... -
什么样的cms系统算是强大
2012-07-10 17:41 986现在建站的cms系统层出不穷。从简单的到功能复杂的。从功 ... -
error: command 'mt.exe' failed with exit status 31
2012-06-18 17:39 2423python setup.py build_ext -i ... -
MyBatis 3 + Spring3 多数据源配置
2012-02-27 14:50 1380详细内容地址: 终于把 MyBatis 3 和 Sp ... -
Google Earth 开发示例(Hello World)
2011-04-13 17:06 1629Google Earth Hello World 示例 &l ... -
DB2 分页查询方法,查询top N 条记录
2011-01-13 18:50 28091. db2分页查询sql select * f ... -
Birt 中的通过Script加入调试输出SQL语句代码
2010-11-18 15:54 1410用Brit制作报表时可通过在Script脚本中加入以下代码输出 ... -
TSM - Creating an include-exclude list (optional)
2010-06-09 11:00 1558Creating an include-exclude l ... -
TSM - Configuring the Web client
2010-06-09 10:51 932Configuring the Web client The ... -
Linux下 Tsm 服务器、客户端安装配置全过程
2010-05-17 10:06 1750系统环境:LINUX AS5 存储:IBM DS400 ... -
安装DB2补丁步骤
2009-10-27 17:30 17641. 通过运行 su - root ... -
WAS 6.0.2.9 部署应用使用过滤器问题解决办法
2009-08-05 16:07 1440支撑环境: IBM WebSphere Application ... -
MyEclipse5.5GA配置Websphere V6.1 全过程(详细版)
2009-07-16 13:32 1284转载自:http://blog.chinaunix.net/u ... -
WebSphere Application Server 6.0.2.9 配置 SqlServer 2000 SP2时出错问题解决
2009-07-15 12:56 1834WebSphere Application Server 6. ... -
WAS 5.1 部署应用容器属性配置
2009-07-07 14:52 2545WAS 5.1 部署应用容器属性配置 引用地址:http:/ ... -
Struts JSR168 Portlet using the ITIM API
2009-06-02 19:29 981Leveraging the IBM Tivoli Ident ... -
ITIM API
2009-06-02 19:22 941ITIM API http://publib.boulder ... -
打开IBM WebSphere Portal trace 收集
2009-05-26 10:37 1430Collecting login-specific infor ... -
解决HP-UX 11iv3 nfs 共享时无法写文件问题方法
2009-05-14 17:21 1932解决在两台HP小机上用SAM 配置的NFS 共享之后,moun ...
相关推荐
OpenCV 背景去除的几种方法 OpenCV 提供了多种方法来实现背景去除,这些方法可以根据不同的应用场景和图像特征进行选择。下面我们将介绍几种常见的背景去除方法: 1. 肤色侦测法 肤色侦测法是基于人机互动方面...
在“opencv背景提取”这个主题中,我们主要关注的是如何从视频流中提取静止背景,以便识别和追踪移动的物体。高斯背景提取是实现这一目标的一种常用方法。 高斯背景模型是一种基于统计的方法,它假设场景中的静态...
### 使用OpenCV实现基于掩码的逼真图像叠加去除白背景 #### 一、引言 在计算机视觉领域,图像处理技术是不可或缺的一部分。其中,掩码(Mask)技术是一种非常实用的方法,常用于实现图像的精准抠取及合成。本文将...
GMM是最常用的一种,它假设每个像素点的亮度由几个高斯分布混合而成,通过学习和更新这些高斯分布来反映背景的变化。 二、GMM背景提取 1. 初始化:首先,我们需要对连续的几帧图像进行处理,初始化每个像素点的高斯...
OpenCV提供了几种背景建模算法,如混合高斯模型(Gaussian Mixture Model,GMM)、历史信息法(Adaptive Background Mixture Models, ABM)等。GMM是常用的背景建模方法,它假设背景由多个高斯分布组成,随着时间...
下面,我们将深入探讨OpenCV中提取轮廓的几种方法。 1. **Canny边缘检测** Canny算法是一种经典的边缘检测方法,它通过高斯滤波消除噪声,然后应用非极大值抑制来找到局部最大值,最后通过双阈值检测确定边缘。在...
在给定的标题“第一种方法的输出.rar_opencv_python opencv_提取前景_背景减除_视频背景减除”以及描述“背景减除提取前景并保存前景视频,利用的是opencv python”中,我们可以深入探讨OpenCV在视频处理中的这一...
本文介绍了一种新型的基于开源计算机视觉库OpenCV的车辆轮廓检测方法。针对传统汽车尺寸参数测量手段相对落后的现状,本文提出了一种结合图像处理技术和计算机视觉算法的新方法。通过对采集到的车辆图像进行预处理...
在OpenCV中,轮廓是一种闭合的曲线,用于描述图像中的对象边界。在处理单据图像时,轮廓提取可以帮助我们识别和分离出单据的边界,以便后续处理。使用`cv2.findContours()`函数可以找到图像中的所有轮廓。这个函数...
很多时候我们手头上可能只有一种背景颜色的证件照,这时候就需要借助图像处理技术来实现背景颜色的更换。传统的图像编辑软件如Photoshop虽然能够完成这一任务,但对于非专业人士来说,操作较为复杂且容易出现边缘...
OpenCV提供了几种不同的方法来实现这一目标,包括背景减除、光流法以及基于深度学习的方法。 1. **背景减除**:这是最常用的一种运动物体检测方法。OpenCV提供了多种背景模型,如混合高斯模型(Gaussian Mixture ...
在基于OpenCV的背景差分方法中,首先需要建立一个静态背景模型。这通常通过对一段时间内的帧进行平均或者高斯混合模型来实现。一旦背景模型建立起来,每帧与背景模型进行比较,找出与背景显著不同的区域,这些差异...
总的来说,核密度背景建模是计算机视觉中一种重要的技术,它利用OpenCV库提供了强大的工具来处理视频数据,实现背景建模和前景检测。理解并掌握这种技术对于开发智能监控系统或者其他相关应用具有重要意义。通过阅读...
OpenCV提供了几种不同的背景差法实现,包括以下几种: 1. **高斯混合模型(Gaussian Mixture Model, GMM)**:OpenCV的`cv::createBackgroundSubtractorMOG2`函数实现了基于高斯混合模型的背景差法。它假设每个像素...
本文将深入探讨标题中提到的几种OpenCV常用的前景提取方法:高斯混合模型(GMM)、VIBE(ViBe)算法以及帧差法。 首先,我们来看**高斯混合模型(GMM)**。GMM是一种统计建模方法,它假设背景由多个高斯分布组成。...
总之,OpenCV提供的光流法工具为开发者提供了一种高效的方法来处理视频中的运动检测问题。通过理解和应用这些工具,我们可以构建强大的视觉系统,实现智能监控、自动驾驶等领域的目标跟踪功能。在实际项目中,根据...
2. **颜色空间转换**:OpenCV允许我们将图像从一种色彩空间转换到另一种,如从BGR(标准RGB)到HSV(色调-饱和度-值)。在HSV色彩空间中,红色通常有较宽的范围,这有助于我们更准确地定义红色的阈值。 3. **阈值...
本文主要针对这一核心问题,对传统的车辆识别和分类方法进行了改进,并提出了一种新的阴影检测方法。 车辆识别和分类通常涉及到以下几个关键技术点: 1. 背景减除(Background Subtraction):这是车辆检测中的...
在计算机视觉领域,背景差分法是一种常见的运动目标检测技术,尤其适用于监控视频分析。本项目基于OpenCV 2.4.3库和Visual Studio 2010开发环境,旨在实现这一功能。OpenCV是一个强大的开源计算机视觉库,包含了众多...
背景减除法是一种常用的运动检测方法,它通过建立背景模型并将其与当前帧进行比较,来识别出运动物体。 【描述】中的“code blocks”是一款流行的开源C++集成开发环境,用于编写和编译程序。在这个项目中,开发者...