您的位置:首页 > 运维架构

OpenCV中将BGR图像转为HSV,并显示

2013-04-14 20:08 197 查看
最近要处理视频中检测到的阴影,看了一些文章,提到可以利用HSV 三个通道中的一个或者两个组合来进行检测与分割,故小试了一下分离HSV通道,如下为代码,整了一个小时,才显示正确。

HSV颜色空间是描述比RGB更准确的颜色感知颜色联系,并在计算上更简单。从RGB颜色空间转换到HSV颜色空间在OpenCV中是如下实现的:



其中的RGB图像不管是8位的,还是16位的,首先需要将其统统转换成浮点型的,即其值在0~1之间。因此转换后的V和S也属于0~1,H属于0~360度。

[html] view
plaincopy

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: