3_opencv2计算机视觉学习_基于类的图像处理
2015-04-11 16:02
756 查看
1、算法中使用策略
策略设计模式的目标就是将算法封装在类中,该模式将算法复杂度隐藏在易用的编程接口背后,降低算法部署难度。例子:设计一个算法,他可以鉴别出图像中含有给定颜色的所有像素。算法输入的是图像以及颜色,并返回表示含有指定颜色的像素的二值图像,并且还要指定对颜色的容忍度。
算法核心部分包含一个遍历每个像素的简单循环,将像素和目标像素进行比较,如果距离小于容忍度则设置为白色,否则设置为黑色。最后返回处理后的图像,实现如下:
//类外定义函数
cv::MatColorDetector::process(constcv::Mat&image){
result.create(image.rows,image.cols,CV_8U);
//得到迭代器
cv::Mat_<cv::Vec3b>::const_iteratorit=image.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::const_iteratoritend=image.end<cv::Vec3b>();
cv::Mat_<uchar>::iteratoritout=result.begin<uchar>();
//对每个像素
for(;it!=itend;++it,++itout){
//处理每个像素---------------------
//计算离目标颜色距离
if(getDistance(*it)<minDist){
*itout=255;
}else{
*itout=0;
}
}
return result;
}
getDistance()函数计算距离:
//内置私有函数
//计算与目标颜色的距离
intgetDistance(constcv::Vec3b&color)const{
//returnstatic_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-target[0],color[1]-target[1],color[2]-target[2])));
//街区距离
returnabs(color[0]-target[0])+
abs(color[1]-target[1])+
abs(color[2]-target[2]);
}
之后定义类,类成员三个,以及相关函数,具体详见程序。我们设置了图片中墙的颜色得到以下结果
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
usingnamespacecv;
usingnamespacestd;
classColorDetector{
private:
//最小可接受距离
intminDist;
//目标色
cv::Vec3btarget;
//结果图像
cv::Matresult;
//内置私有函数
//计算与目标颜色的距离
intgetDistance(constcv::Vec3b&color)const{
//returnstatic_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-target[0],color[1]-target[1],color[2]-target[2])));
returnabs(color[0]-target[0])+
abs(color[1]-target[1])+
abs(color[2]-target[2]);
}
public:
//空构造函数
ColorDetector():minDist(100){
//初始化默认表
target[0]=target[1]=target[2]=0;
}
//设置色彩距离阈值。阈值必须为正,否则为0
voidsetColorDistanceThreshold(intdistance){
if(distance<0)
distance=0;
minDist=distance;
}
//获取色彩距离阈值
intgetColorDistanceThreshold()const{
returnminDist;
}
//设置需要检测的颜色
voidsetTargetColor(unsignedcharred,unsignedchargreen,unsignedcharblue){
//BGR顺序
target[2]=red;
target[1]=green;
target[0]=blue;
}
//设置需检测颜色
voidsetTargetColor(cv::Vec3bcolor){
target=color;
}
//获取需检测的颜色
cv::Vec3bgetTargetColor()const{
returntarget;
}
cv::Matprocess(constcv::Mat&image);
};
//类外定义函数
cv::MatColorDetector::process(constcv::Mat&image){
result.create(image.rows,image.cols,CV_8U);
//得到迭代器
cv::Mat_<cv::Vec3b>::const_iteratorit=image.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::const_iteratoritend=image.end<cv::Vec3b>();
cv::Mat_<uchar>::iteratoritout=result.begin<uchar>();
//对每个像素
for(;it!=itend;++it,++itout){
//处理每个像素---------------------
//计算离目标颜色距离
if(getDistance(*it)<minDist){
*itout=255;
}else{
*itout=0;
}
}
returnresult;
}
intmain(){
ColorDetectorcdectect;
Matimage=imread("bridge.jpg");
cdectect.setTargetColor(97,59,40);//墙的颜色
namedWindow("result");
imshow("result",cdectect.process(image));
waitKey(0);
return0;
}
相关文章推荐
- 计算机视觉与图像处理学习笔记(三)opencv的基本数据类型与简单图像处理函数
- 计算机视觉与图像处理学习笔记(二)win32+mingw+opencv搭建
- OpenCV 图像处理 计算机视觉 深度学习 优秀博主推荐
- 无需复杂深度学习算法,基于计算机视觉使用Python和OpenCV计算道路交通
- OpenCV(三)回归计算机视觉,对图像平滑处理
- OpenCV2 图像处理与计算机视觉(一)—— 去除一幅二值化图像中的椒盐噪声
- 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统
- 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统
- 图像处理与计算机视觉学习资源
- 【OpenCV图像处理入门学习教程四】基于LoG算子的图像边缘检测
- 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统
- OpenCV3计算机视觉Python语言实现(三):使用OpenCV3处理图像
- 学习《OpenCV 2 计算机视觉编程手册》第二章遍历图像和领域操作实例——对图像进行锐化
- 【OpenCV图像处理入门学习教程三】基于SIFT特征和SURF特征的微旋转图像拼接与融合生成全景图像的比较
- 图像处理与计算机视觉开源软件库及学习站点
- 【OpenCV学习笔记 006】基于类的图像处理
- OpenCV2计算机编程手册(二)基于类的图像处理
- OpenCV-图像处理和计算机视觉
- 图像处理与计算机视觉开源软件库及学习网站
- 【OpenCV图像处理入门学习教程五】基于背景差分法的视频目标运动侦测