cvInRangs()主要是将图像中不满足范围条件的像素区域筛除。
借鉴了一个小程序。
#include "stdafx.h"
//#include "cv.h"#include "highgui.h"
#include "opencv2\opencv.hpp"
#include <ctype.h>
#include <stdio.h>
#include <iostream>
using namespace cv;
int main()
{
printf("此程序将输入的图片由一般的RGB色系转化为HSV色系,然后对图片取掩膜板,\
可以对掩膜板的H、S、V三个元素取不同的范围进行测试并查看, \
效果,拖动滑动条即可选择范围!按 q 键退出测试!\n\n");
int hmax=0,hmin=0,vmin=0,vmax=0,smin=0,smax=0;
if(argc<=1)
{
std::cout<<"Error:Please Load a picture!"<<std::endl;
return 0;
}
IplImage *tempImg,*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);
//分配图像空间
CvSize ImgSize = {512, 512};
IplImage* image = cvCreateImage(ImgSize,IPL_DEPTH_8U,3);
tempImg=cvLoadImage("c:\\sourcePictures\\XX2.jpg");
cvResize(tempImg, image);
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;
}