3_opencv2计算机视觉学习_基于类的图像处理
来源:互联网 发布:哪个软件看泰剧最多 编辑:程序博客网 时间:2024/05/18 20:53
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;}
0 0
- 3_opencv2计算机视觉学习_基于类的图像处理
- 1_opencv2计算机视觉学习_图像载入显示操作
- 2_opencv2计算机视觉学习_操作像素
- 2_opencv2计算机视觉学习_操作像素
- 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统
- 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统
- 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统
- 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统
- 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统
- 图像处理、图像识别、计算机视觉3者的异同
- 计算机视觉、图像处理学习资料汇总
- 计算机视觉、图像处理学习资料汇总
- 计算机视觉、图像处理学习资料汇总
- 计算机视觉、图像处理学习资料汇总
- 计算机视觉、图像处理学习资料汇总
- 计算机视觉、图像处理学习资料汇总
- 图像处理与计算机视觉学习资源
- 基于计算机视觉的高精度图像拼接
- 算数表达式求值
- 第六周项目一--深复制体验
- Matlab 常用命令
- NGUI控件说明(中文) UIGrid
- PHP学习笔记1
- 3_opencv2计算机视觉学习_基于类的图像处理
- 第六届南桥杯A组Java第一题 熊怪吃核桃
- 应用的相关测试平台
- libgdx iOS 项目应用名国际化
- Boost.deadline_timer实现定时器功能时需注意的时区问题
- Android学习之旅:Android版本号与Android level对应关系
- 【动态规划】[HDU1693] Eat the Trees
- 笔试笔试!!笔试笔试!!
- Convert Sorted Array to Binary Search Tree-LeetCode