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函数演示的更多相关文章

  1. Delphi_07_Delphi_Object_Pascal_基本语法_05_函数参数

    这里主要讨论Delphi中函数.方法的相关内容. 一.工程文件 { Delphi语法方法和函数 1.方法 2.函数 } program Routine; {$APPTYPE CONSOLE} uses ...

  2. 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...

  3. jQuery+fullPage.js演示10种全屏滚动

    基本演示 背景演示 循环演示 回调函数演示 绑定菜单演示 项目导航演示 自动滚动 slide自动滚动 响应式 下载地址 实例代码 <!DOCTYPE html> <html lang ...

  4. R语言演示功能

    大家熟知的画图ggplot2包 library(ggplot2) #查看系统自带的qplot的函数演示 example(qplot) #R语言的基本对象 向量.矩阵.数组.数据框.列表 R语言的变量都 ...

  5. 不可或缺 Windows Native (6) - C 语言: 函数

    [源码下载] 不可或缺 Windows Native (6) - C 语言: 函数 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 函数 示例cFunction.h # ...

  6. matlab调用opencv函数的配置

    环境: VS2010 活动解决方案平台x64 WIN 8.1 Opencv 2.4.3 Matlab 2012a 1.  首先保证vs2010能正确调用opencv函数, 2.  Matlab中选择编 ...

  7. DrawDib函数组的使用

    Microsoft的针对与设备无关位图(DIB位图),在其WIN32 SDK的Multimedia中提供了一组绘制DIB位图的高性能函数组──DrawDib函数组.DrawDib函数组是一组不依赖于图 ...

  8. Python学习入门教程,字符串函数扩充详解

    因有用户反映,在基础文章对字符串函数的讲解太过少,故写一篇文章详细讲解一下常用字符串函数.本文章是对:程序员带你十天快速入门Python,玩转电脑软件开发(三)中字符串函数的详解与扩充. 如果您想学习 ...

  9. python第四十八课——类函数和对象函数

    5.类函数和对象函数 类函数:在定义函数的上面一行书写@classmethod,特点:没有self 有cls 对象函数:定义在class中的普通的def函数 演示类函数和对象函数的定义使用: 总结: ...

随机推荐

  1. IO操作概念。同步、异步、阻塞、非阻塞

    “一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作. 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO. 阻塞IO和非阻塞IO的区别在于第 ...

  2. 用PHP向mysql添加数据

    <?php $name=$_POST['name']; $gender = $_POST['gender']; $age=$_POST['age']; #连接到数据库 $link = mysql ...

  3. switch(){}default后是有冒号的

    switch: function a(c,d){ switch(c+d){ : console.log(); break; : console.log(); break; : console.log( ...

  4. ApexSQLLog总结

    我们程序最近做更新,要做新功能的测试.程序经常出现大的事务,每次commit之后如果发现数据不对的问题也不能再回滚进行断点调试了,因为数据库数据已经更改了,所以一直想找一个回滚我数据库所有操作的工具. ...

  5. .NET ORM工具Pax实战

    Pax是微软的一个ORM读写工具,比NHibernate更好用.可以在项目中用Nuget下载并安装. 可以看到引用中多了 在App.config里设置配置文件如下 <?xml version=& ...

  6. 10个顶级的CSS UI开源框架

    随着CSS3和HTML5的流行,我们的WEB页面不仅需要更人性化的设计理念,而且需要更酷的页面特效和用户体验.作为开发者,我们需要了解一些宝贵的CSS UI开源框架资源,它们可以帮助我们更快更好地实现 ...

  7. unkow jdbc driver : http://maven.apache.org

    报了这么一个错,找了很久才找到问题出在哪里,具体为什么会什么出现现在还不怎么懂,只是现在能让它继续跑起来 这个错是因为我的spring-mybatis.xml文件读取不了jdbc.properties ...

  8. 丰富自己的代码库-SqlServerHelper(Ado)

    设计思路很简单,就是把数据封装为DataTable类,封装了类型转换,使用者可以不必考虑任何类型转换,而使用VC提供的CString即可.封装了按行号查找功能,先看代码 #pragma once #i ...

  9. WAP端 touch事件触发顺序记录

    IOS7.0 safari 滚动滚动条的时候, 最后手指放开 (scroll 总是在 touchend后面,所以要用 setTimeout) touchstart touchmove(多个) touc ...

  10. smbclient提示NT_STATUS_INSUFFICIENT_RESOURCES

    Rhel6中使用smbclient命令打开windows共享文件夹,出现: Linux Samba protocol negotiation failed: NT_STATUS_INSUFFICIEN ...