最近要处理视频中检测到的阴影,看了一些文章,提到可以利用HSV 三个通道中的一个或者两个组合来进行检测与分割,故小试了一下分离HSV通道,如下为代码,整了一个小时,才显示正确。
HSV颜色空间是描述比RGB更准确的颜色感知颜色联系,并在计算上更简单。从RGB颜色空间转换到HSV颜色空间在OpenCV中是如下实现的:
其中的RGB图像不管是8位的,还是16位的,首先需要将其统统转换成浮点型的,即其值在0~1之间。因此转换后的V和S也属于0~1,H属于0~360度。
#include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "cvaux.h"
int _tmain(int argc, _TCHAR* argv[])
{
IplImage* src = NULL;
IplImage* floatsrc = NULL;
IplImage* floathsv = NULL;
IplImage* floatimgH = NULL;
IplImage* floatimgS = NULL;
IplImage* floatimgV = NULL;
cvNamedWindow( "src", 1 );
cvNamedWindow( "HSV", 1 );
cvNamedWindow( "H通道", 1 );
cvNamedWindow( "S通道", 1 );
cvNamedWindow( "V通道", 1 );
src = cvLoadImage( "D:\\lena.jpg", -1);
CvSize size = cvGetSize( src );
//先将图像转换成float型的
floatsrc = cvCreateImage( size, IPL_DEPTH_32F, 3 );
floathsv = cvCreateImage( size, IPL_DEPTH_32F, 3 );
floatimgH = cvCreateImage( size, IPL_DEPTH_32F, 1 );
floatimgS = cvCreateImage( size, IPL_DEPTH_32F, 1 );
floatimgV = cvCreateImage( size, IPL_DEPTH_32F, 1 );
//将src从8位转换到32位的float型
cvConvertScale( src, floatsrc, 1.0/255.0, 0 );
//将float型图像 从BGR转换到HSV 如果需要转换到其他的颜色空间 那么改变CV_BGR2HSV即可
//cvCvtColor要求两个参数的类型必须完全相同,所以要转为float型
cvCvtColor( floatsrc, floathsv, CV_BGR2HSV);
//将三通道图像 分解成3个单通道图像,H对应的通道时0,S、V对应的通道时1和2
//cvCvtPixToPlane(picHSV, h_plane, s_plane, v_plane, 0);
cvSplit( floathsv, floatimgH, floatimgS, floatimgV, 0);
cvShowImage( "src", src );
cvShowImage( "HSV", floathsv );
cvShowImage( "H通道", floatimgH );
cvShowImage( "S通道", floatimgS );
cvShowImage( "V通道", floatimgV );
cvWaitKey( 0 );
cvReleaseImage( &src );
cvReleaseImage( &floathsv );
cvReleaseImage( &floatimgH );
cvReleaseImage( &floatimgS );
cvReleaseImage( &floatimgV );
return 0;
}