您的位置:首页 > 理论基础

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 c++ 计算机视觉
相关文章推荐