概述
这个函数可以通过定义一个 色彩范围 并遍历图像,过滤每一个像素;范围内的单元数值置为255,范围外的单元数值置为0,最终得到一个二值化的图像,便于后续图像处理。
函数
void cv::inRange
(
InputArray src,
InputArray lowerb,
InputArray upperb,
OutputArray dst
)
src | 输入对象 |
lowerb | 色彩范围下限 |
upperb | 色彩范围上限 |
dst | 输出对象 |
测试代码
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//加载文件
Mat src = imread("c:/opencv/x4.png");
imshow("src",src);
//定义过程对象
Mat img_HSV;
Mat img_range;
Mat img_erode;
Mat img_dilate;
//颜色空间转换
cvtColor(src,img_HSV,COLOR_BGR2HSV);
//显示
imshow("img_HSV",img_HSV);
//定义范围
int hmin=0,
smin=120,
vmin=80;
Scalar lower(hmin,smin,vmin);
int hmax=10,
smax=240,
vmax=150;
Scalar upper(hmax,smax,vmax);
//颜色识别
inRange(img_HSV,lower,upper,img_range);
//腐蚀
erode(img_range,img_erode,Mat(),Point(-1,-1),3);
//膨胀
dilate(img_erode,img_dilate,Mat(),Point(-1,-1),3);
//显示
imshow("img_dilate",img_dilate);
}
Widget::~Widget()
{
delete ui;
}
测试结果
通过测试,可以看到,通过颜色识别,配合腐蚀、膨胀,可以得到比较理想的二值化图像。
如果后面再经过滤波、边缘检测、轮廓检测等操作,就可以得到图像的轮廓。