问题提出:

在实际的编程过程中,有时候单纯的让一个函数产生一个返回值已经不能满足实际的需要,但是又不能将函数执行两次,或者多次,返回不同的变量。这样就需要使函数同时返回多个变量,需要将返回值定义成类的形式,也就是说定义了一个类的对象,返回的就是一个对象,这样这个对象就可以包含多个变量了。例如:

首先在字符识别的头文件(OCR.h)中定义类:

class CharSegment{
public:CharSegment();CharSegment(Mat i, Rect p);Mat img;Rect pos;CharSegment(string str,int y0,int y1,int y2,int height);string Char_str;int y0_pos;int y1_pos;int y2_pos;int Char_height;
};

这个类中包含三种成员函数,2+4个成员变量(CharSegment(Mat i, Rect p)两个变量,CharSegment(string str,int y0,int y1,int y2,int height)4个变量;

在OCR.cpp文件中是成员函数的实现,如下:

CharSegment::CharSegment(){}
CharSegment::CharSegment(Mat i, Rect p)
{img=i;pos=p;
}
CharSegment::CharSegment(string str,int y0,int y1,int y2,int height)
{Char_str=str;y0_pos=y0;y1_pos=y1;y2_pos=y2;Char_height=height;
}:

由类名定义的函数的声明:

class OCR{public:bool DEBUGTEST;bool saveSegments;string filename;static const int numCharacters;static const char strCharacters[];OCR(string trainFile);OCR();CharSegment run(Plate *input);//由类名定义的函数的声明int charSize;Mat preprocessChar(Mat in);int classify(Mat f);void train(Mat trainData, Mat trainClasses, int nlayers);int classifyKnn(Mat f);void trainKnn(Mat trainSamples, Mat trainClasses, int k);Mat features(Mat input, int size);private:bool trained;vector<CharSegment> segment(Plate input);Mat Preprocess(Mat in, int newSize);        Mat getVisualHistogram(Mat *hist, int type);void drawVisualFeatures(Mat character, Mat hhist, Mat vhist, Mat lowData);Mat ProjectedHistogram(Mat img, int t);bool verifySizes(Mat r);CvANN_MLP  ann;CvKNearest knnClassifier;int K;
};

函数的具体实现:

CharSegment OCR::run(Plate *input)  //注意函数类型
{vector<int>xpositions;vector<int>orderIndex; CharSegment output;       //定义函数返回值//Segment chars of platevector<CharSegment> segments=segment(*input);for(int i=0; i<segments.size(); i++){//Preprocess each char for all images have same sizesMat ch=preprocessChar(segments[i].img);if(saveSegments){stringstream ss(stringstream::in | stringstream::out);ss << "tmpChars/" << filename << "_" << i << ".jpg";imwrite(ss.str(),ch);}//For each segment Extract FeaturesMat f=features(ch,15);//For each segment feature Classifyint character=classify(f);input->chars.push_back(strCharacters[character]);input->charsPos.push_back(segments[i].pos);xpositions.push_back(segments[i].pos.x);orderIndex.push_back(i);}string str="";float min=xpositions[0];int minIdx=0;for(int i=0; i<4; i++){min=xpositions[i];minIdx=i;for(int j=i; j<4; j++){if(xpositions[j]<min){min=xpositions[j];minIdx=j;}}int aux_i=orderIndex[i];int aux_min=orderIndex[minIdx];orderIndex[i]=aux_min;orderIndex[minIdx]=aux_i;float aux_xi=xpositions[i];float aux_xmin=xpositions[minIdx];xpositions[i]=aux_xmin;xpositions[minIdx]=aux_xi;}//第二行for(int i=4; i<8; i++){min=xpositions[i];minIdx=i;for(int j=i; j<8; j++){if(xpositions[j]<min){min=xpositions[j];minIdx=j;}}int aux_i=orderIndex[i];int aux_min=orderIndex[minIdx];orderIndex[i]=aux_min;orderIndex[minIdx]=aux_i;float aux_xi=xpositions[i];float aux_xmin=xpositions[minIdx];xpositions[i]=aux_xmin;xpositions[minIdx]=aux_xi;}//第一行for(int i=8; i<12; i++){min=xpositions[i];minIdx=i;for(int j=i; j<12; j++){if(xpositions[j]<min){min=xpositions[j];minIdx=j;}}int aux_i=orderIndex[i];int aux_min=orderIndex[minIdx];orderIndex[i]=aux_min;orderIndex[minIdx]=aux_i;float aux_xi=xpositions[i];float aux_xmin=xpositions[minIdx];xpositions[i]=aux_xmin;xpositions[minIdx]=aux_xi;}for(int j=0;j<4;j++){char temp[4];temp[j]=orderIndex[j];orderIndex[j]=orderIndex[j+8];orderIndex[j+8]=temp[j];}  for (int i = 0; i <12;i++){str=str+input->chars[orderIndex[i]];if((i==2)||(i==6)||(i==10)) {str=str+".";}if((i==3)||(i==7)||(i==11)) {str=str+"\r\n";}}int y0_mean=((segments[0].pos.y+segments[0].pos.height)+(segments[1].pos.y+segments[1].pos.height)+ (segments[2].pos.y+segments[2].pos.height)+(segments[3].pos.y+segments[3].pos.height))/4;int y1_mean=((segments[4].pos.y+segments[4].pos.height)+(segments[5].pos.y+segments[5].pos.height)+ (segments[6].pos.y+segments[6].pos.height)+(segments[7].pos.y+segments[7].pos.height))/4;int y2_mean=((segments[8].pos.y+segments[8].pos.height)+(segments[9].pos.y+segments[9].pos.height)+ (segments[10].pos.y+segments[10].pos.height)+(segments[11].pos.y+segments[11].pos.height))/4;int height_mean=(segments[0].pos.height+segments[4].pos.height+segments[8].pos.height)/3;output=CharSegment(str,y0_mean,y1_mean,y2_mean,height_mean);return  output;//input->str();
}

函数的调用:

 CharSegment plateNumber=ocr.run(&plate);

函数成员变量的使用:

  CString CSstr=_T("");CSstr.Format(_T("%s"),plateNumber.Char_str.c_str());ResultBox->SetWindowText(CSstr);

【C++编程技巧】函数多个返回值相关推荐

  1. python函数返回值和参数_python_函数参数和返回值

    01.函数参数和返回值的作用 函数:封装功能独立的代码,在需要时通过函数名调用,可以直接访问全局变量 参数:外界希望在函数内部处理数据 返回值:向外界报告函数的执行结果 定义函数时, 是否接受参数,或 ...

  2. python函数参数定义顺序_Python函数定义-位置参数-返回值

    原标题:Python函数定义-位置参数-返回值 1 函数介绍 函数在编程语言中就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字.可以通过函数名在程序的不同地方多 ...

  3. python write函数参数_Python函数-函数参数、返回值

    函数 1.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫         做subroutine(子过 ...

  4. C++ 函数的引用返回值

    C++ 函数的引用返回值 2009-09-17 09:29 引用是给变量取一个别名,所以引用传递会直接进行变量本身的传递.它的最大好处是可以把别处对变量的改变保留下来,第二好处是它提高了性能:如果函数 ...

  5. python函数参数学习_python学习笔记-11.函数参数和返回值进阶

    1. 函数参数和返回值的作用 函数根据有没有参数以及有没有返回值,可以相互组合,共有4种形式: 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值 定义函数时,是否接收参数,或者是 ...

  6. const 修饰函数参数,返回值,函数体,保护数据

    一.const 介绍 1.const 定义 const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. 2.const 目的 const 推出的初始目的,正是为了取代预编译指令,消除 ...

  7. MATLAB中如何忽略函数中前几个不需要的返回值而只取需要的返回值,例如:只取函数第二个返回值,而忽略第一个返回值

    1 致谢 感谢网友honglei.chen的回答, 原文链接如下: https://www.ilovematlab.cn/thread-203269-1-1.html 2 前言 今天在学习神经网络算法 ...

  8. await把Promise解析为普通对象,async函数return的返回值是promise对象,await后转化为普通Object

    async函数return的是Promise,await Promise后得到Object 文章目录 前言 1.函数return的返回值Object,await后得到的是Object 2.async函 ...

  9. linux内核函数出错的返回值

    linux内核函数出错的返回值 1. 函数返回指针 2. 如何通过错误信息指针来返回错误信息 3. 出错代码返回指针在(-1000,0)区间 4. 错误的判断和错误原因的打印 4.1 错误的判断 4. ...

  10. Python基础学习_函数数def_返回值及返回值类型_函数块

    一. 返回值 函数作用:显示输出.处理数据并返回数据结果 函数返回值的定义:函数返回值被称为返回值 写法: 函数体内 return 返回值 (将值返回到调用函数的代码行) 返回值类型: "& ...

最新文章

  1. C#编程应用--线程与委托
  2. mysql5.7.25数据库安装
  3. mysql 主从热备份 5.6 参数_MySQL主从热备份
  4. preempt_count
  5. php 论坛回复引用功能,PHPWind商业版论坛功能介绍
  6. 学计算机电脑厚度23mm,电脑桌尺寸标准
  7. MQTT协议报文格式解析
  8. 施乐服务器装系统闪EE,施乐7535755633755575驱动安装教程
  9. 数据结构与算法分析(C++版) 张铭 等译
  10. 条件数、奇异值与海森矩阵
  11. MySQL单表数据量大优化方案及注意事项
  12. 【新闻文本分类】(task4)使用gensim训练word2vec
  13. PaintFlagsDrawFilter canvas 抗锯齿
  14. python能不能互动执行_细思恐极,插上U盘就开始执行Python代码
  15. yo搭建nodejs项目脚手架
  16. 开源中国源码学习UI篇(二)之NavigationDrawer+Fragment的使用分析
  17. STM32(三) ENC28J60以太网(一)
  18. Spring Boot、Spring MVC、Spring:它们有什么区别?
  19. 带有非期望产出的SBM模型(python)
  20. 20-巴基斯坦-密码(rsa)

热门文章

  1. 04. 替换空格(C++版本)
  2. 排序算法之一 冒泡排序(C++版本)
  3. 03. Use const whenever possible
  4. 像素生存者2为什么显示服务器不可用,像素生存者2为什么更新了玩不了 | 手游网游页游攻略大全...
  5. 帝豪gs车机系统wince_平顶山到河南,帝豪GS俱乐总部,帝豪GS两年用车感受
  6. vba 自动排序_Excel表格自动排序,神了!
  7. spring基于注解的 IOC 配置ioc实现crud
  8. java 排水管网 系统_排水管网数字化管理系统
  9. mysql数据库安全怎么设置密码_关于mysql的数据库的安全问题
  10. JavaScript:判断两个日期之间的差距天数