首页 > 代码库 > cvInRangeS函数演示
cvInRangeS函数演示
camshift算法中,用到了cvInRangeS函数,作为初学者,对这个函数很不理解,所以就写了个程序演示效果,加强理解。
代码:
#include "cv.h"#include "highgui.h"#include<ctype.h>int hmax=0,hmin=0,vmin=0,vmax=0,smin=0,smax=0;int main(int argc,char **argv){ printf("此程序将输入的图片由一般的RGB色系转化为HSV色系,然后对图片取掩膜板,可以对掩膜板的H、S、V三个元素取不同的范围进行测试并查看, 效果,拖动滑动条即可选择范围!按 q 键退出测试!\n\n"); if(argc<=1) { std::cout<<"Error:Please Load a picture!"<<std::endl; return 0; } IplImage *image,*hsv,*mask; //创建窗口 cvNamedWindow("image",CV_WINDOW_AUTOSIZE); cvNamedWindow("hsv",CV_WINDOW_AUTOSIZE); cvNamedWindow("mask",CV_WINDOW_AUTOSIZE); cvNamedWindow("Track",CV_WINDOW_AUTOSIZE); cvCreateTrackbar("Hmin","Track",&hmin,256,0); cvCreateTrackbar("Hmax","Track",&hmax,256,0); cvCreateTrackbar("Smin","Track",&smin,256,0); cvCreateTrackbar("Smax","Track",&smax,256,0); cvCreateTrackbar("Vmin","Track",&vmin,256,0); cvCreateTrackbar("Vmax","Track",&vmax,256,0); //分配图像空间 image=cvLoadImage(argv[1]); hsv=cvCreateImage(cvGetSize(image),8,3); mask=cvCreateImage(cvGetSize(image),8,1); //将RGB转化为HSV色系 cvCvtColor(image,hsv,CV_RGB2BGR); cvShowImage("image",image); cvShowImage("hsv",hsv); int _hmax=0,_hmin=0,_vmin=0,_vmax=0,_smin=0,_smax=0,flag=0; while(flag!=‘q‘) { _hmax=hmax,_hmin=hmin,_vmin=vmin,_vmax=vmax,_smin=smin,_smax=smax; //制作掩膜板 cvInRangeS(hsv,cvScalar(MIN(_hmax,_hmin),MIN(_smax,_smin),MIN(_vmax,_vmin),0), cvScalar(MAX(_hmax,_hmin),MAX(_smax,_smin),MAX(_vmax,_vmin),0),mask); //显示图像 cvShowImage("mask",mask); flag=cvWaitKey(40); } cvDestroyAllWindows(); cvReleaseImage(&image); cvReleaseImage(&hsv); cvReleaseImage(&mask); system("pause"); return 0;}
效果:
可以拖动进度条改变范围。
OpenCVchm文档上对函数的解释:
InRangeS
检查数组元素是否在两个数量之间
void cvInRangeS( const CvArr* src, CvScalar lower, CvScalar upper, CvArr* dst );
src
第一个原数组
lower
包括进的下边界.
upper
不包括进的上边界
dst
输出数组必须是 8u 或 8s 类型.
函数 cvInRangeS 检查输入数组元素范围:对于单通道数组:
dst(I)=lower0 <= src(I)0 < upper0
对于双通道数组以此类推:
dst(I)=lower0 <= src(I)0 < upper0 &&
lower1 <= src(I)1 < upper1
如果 src(I) 在范围内dst(I)被设置为 0xff (每一位都是 ‘1‘)否则置0 。所有的数组必须有相同的大小(或ROI大小)
个人总结:
通过程序的演示,这个函数其实没什么特别的,只是为了选取在某个范围之内的像素点出来,并设定为1,其它不在范围内的像素点设为0,没什么特别的。但是这个范围不同,最终效果差别会很大。至于对于camshift算法的作用,我想是为了camshift算法更好更精确的跟踪物体。现在并不知道这个范围该怎么选取,这个问题以后还需要继续探究。
cvInRangeS函数演示
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。