应用:

存在于一幅图片中的两个矩形区域,计算其距离并判断其是否邻近。邻近则返回真,否则返回假。

(注:我在此处存储单个矩形的数据格式为vector<int>,方便自己读写数据)

int API_CONTOURRECTS::rectsIfMerge(const vector<int>                       contRectI,              //矩形框Iconst vector<int>                       contRectJ,              //矩形框Jint                                   &dist,                  //返回矩形框的距离bool                                  &mergeFlag)             //返回矩形是否邻近
{   if(contRectI.size() < 1){cout<<"[contRectI.size < 1 !]"<<endl;return -1;}if(contRectJ.size() < 1){cout<<"[contRectJ.size < 1 !]"<<endl;return -1;}//int nRet = 0;int x1, y1, x11, y11, x2, y2, x22, y22;           //分别记录两个矩形框的左上角顶点及右下角顶点位置double Wi, Hi, Ai, Wj, Hj, Aj;                 //分别记录两个矩形框的宽、高和面积double Uw, Uh, Ur, Ow, Oh, Oa, Rh, Rw;        //记录两个矩形框合并的宽高及其比,重叠的宽高及其面积,以及高度偏移、宽度偏移double Trh = 0.3, Trw = 0.3, Trow = 4, Troh = 4;//设定高度偏移的阈值、宽度偏移的阈值、宽度重叠的阈值、高度重叠的阈值x1  = contRectI[0];                                            // left vertex xy1  = contRectI[1];                                            // left vertex yx11 = contRectI[2];                                            // right vertex xy11 = contRectI[3];                                           // right vertex yWi = x11 - x1;                                                    // the ith rect widthHi = y11 - y1;                                                    // the ith rect heightAi = Wi * Hi;                                                    // the ith rect areax2  = contRectJ[0];                                    // left vertex xy2  = contRectJ[1];                                    // left vertex yx22 = contRectJ[2];                                    // right vertex xy22 = contRectJ[3];                                   // right vertex yWj = x22 - x2;                                            // the jth rect widthHj = y22 - y2;                                            // the jth rect widthAj = Wj * Hj;                                             // the jth rect width//rect union compute to judge if rects are neighborsUw = max(x11, x22) - min(x1, x2);                     //union widthUh = max(y11, y22) - min(y1, y2);                         //union heightUr = Uw / Uh;                                            //union rateOw = Wi + Wj - Uw;                                    //over widthOh = Hi + Hj - Uh;                                        //over heightOa = Ow * Oh;                                     //over areaRh = max(abs(y1 - y2), abs(y11 - y22)) / min(Hj, Hi);           //height shiftRw = max(abs(x1 - x2), abs(x11 - x22)) / min(Wj, Wi);        //width  shift// shift and over controlif(Rh < Trh && abs(Ow) < Trow){dist = abs(Ow);mergeFlag = true;}else if(Rw < Trw && abs(Oh) < Troh){   //cout<<"merge"<<endl;dist = abs(Oh);mergeFlag = true;}return nRet;
}
// merge contour rects
int API_CONTOURRECTS::contoursRectMerge( const vector<vector<int>>                  contRectAll,    //一幅图片中裁取的所有矩形vector<vector<int>>                       &contRectTemp)  //合并邻近矩形后的所有矩形
{if( contRectAll.size() < 1 ){cout<<" contRectAll.size < 1 !]"<<end;return -1;}//int nRet = 0;bool mergeFlag;      //记录两个矩形是否邻近//vector<int> mergeIndexTemp; //存储由当前点开始计算的邻近矩形链索引vector<int> distances;            //存储由当前点开始计算的邻近对的距离vector<int> contRectOne;       //存储由当前点开始计算的邻近矩形链组成的新的矩形坐标vector<bool> pairSecondFlag;   //记录当前点是否已存在于已有点的邻近矩形链中//int num = 0;int dist ;                //记录当前两个矩形框的距离int deleteThresh = 3;    //(合并后的)矩形框大小限制阈值//   int minNeighborIndex;       //记录与当前点最近的矩形索引/*************************** neighbors judge *****************************/pairSecondFlag.clear();       //所有点初始化为falsefor(int i = 0; i < contRectAll.size(); i++)pairSecondFlag.push_back(false);contRectTemp.clear();contRectOne.clear();for(int k = 0; k < contRectAll.size(); k++){  //遍历所有矩形if(pairSecondFlag[k]){  //判断当前点是否已存在于已有点的邻近矩形链中,若存在,则当前点不再作为新的矩形起始点进行查询continue;}contRectOne = contRectAll[k];   //取出该矩形for(int i = 0; i < contRectAll.size();){ //以当前第i个矩形为起始,与其后所有矩形进行比较if(pairSecondFlag[i]){  //判断当前矩形是否已存在于已有矩形的邻近矩形链中,若存在,则当前矩形不再作为新的矩形起始点进行查询i++;continue;}mergeIndexTemp.clear();distances.clear();for(int j = i + 1; j < contRectAll.size(); j++){    //该段代码使用了三个for循环,效率低下,还没想好优化的方法,欢迎博友们提出宝贵意见if(pairSecondFlag[j])   //判断当前矩形是否已存在于已有矩形的邻近矩形链中,若存在,则当前矩形不再作为新的矩形起始点进行查询continue;mergeFlag = false;        //初始化mergeFlagnRet = rectsIfMerge(contRectOne, contRectAll[j], dist, mergeFlag);       //判断两个矩形是否邻近,返回dist及mergeFlagif(nRet != 0)continue;if(mergeFlag){       //mergeFlag为真时,表示两个矩形邻近distances.push_back(dist);        //存储矩形距离mergeIndexTemp.push_back(j);    //存储邻近矩形的索引}}if(distances.size() > 0 && mergeIndexTemp.size() > 0){           //找到与当前矩形邻近的矩形vector<int>::iterator smallest = min_element(begin(distances), end(distances));    minNeighborIndex = mergeIndexTemp[distance(begin(distances), smallest)];       //找出与其距离最小的矩形索引minNeighborIndexcontRectOne[0] = min(contRectOne[0], contRectAll[minNeighborIndex][0]);         contRectOne[1] = min(contRectOne[1], contRectAll[minNeighborIndex][1]);                contRectOne[2] = max(contRectOne[2], contRectAll[minNeighborIndex][2]);            contRectOne[3] = max(contRectOne[3], contRectAll[minNeighborIndex][3]);    //将两个矩形合并为新的矩形i = minNeighborIndex;        //继续判断minNeighborIndex之后的矩形pairSecondFlag[minNeighborIndex] = true;        //置当前找到的最小距离矩形为已存在已有矩形链中}else{                                          //未找到与当前矩形邻近的矩形if(abs(contRectOne[2] - contRectOne[0]) > deleteThresh && abs(contRectOne[3] - contRectOne[1]) > deleteThresh){        //将矩形大小控制在deleteThresh×deleteThresh之内contRectTemp.push_back(contRectOne);                   //存入矩形}break;    //结束判断第i个矩形后的矩形链}}}    /*************************** variables release *********************************/vector<int>().swap(mergeIndexTemp);vector<int>().swap(contRectOne);vector<bool>().swap(pairSecondFlag);vector<int>().swap(distances);return nRet;
}

注:该规则有些简单粗暴,希望有更好规则见解的朋友提出宝贵意见,不胜感激!

C++ 判断一幅图片中的两个矩形区域是否邻近相关推荐

  1. 从给定的大图中切出指定矩形区域的小图

    UIImage *image1 = [UIImage imageNamed:@"1.png"]; CGRect. rect = CGRectMake(0, 0,100,100);C ...

  2. 如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录

    如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录 目录

  3. Python编程语言学习:python的列表的特殊应用之一行命令实现if判断中的两类判断

    Python编程语言学习:python的列表的特殊应用之一行命令实现if判断中的两类判断 目录 python的列表的特殊应用 一行命令实现if判断中的两类判断 python的列表的特殊应用 一行命令实 ...

  4. 给定一个字符串,判断该字符串中是否包含某个子串.如果包含,求出子串的所有出现位置. 要求:从键盘输入两个字符串,第一个是给定的字符串,第二个是子串。

    给定一个字符串,判断该字符串中是否包含某个子串.如果包含,求出子串的所有出现位置. 要求:从键盘输入两个字符串,第一个是给定的字符串,第二个是子串. 输入 abcd23abc34bcd bc 输出 1 ...

  5. excel中对比两个sheet,找出匹配不上的

    问题描述:数据的特点是,在同一个excel文件中存在两个sheet,他们的数据结构是一样的,其中一个中的数据是另一个的子集,目的是要找出他们的不同,即找出在那张大些的sheet中存在,但在那张小些的s ...

  6. java map key是否存在_java中如何判断map集合中是否存在key

    有两种方法可以判断map集合中是否存在某个key. 方法1:直接使用java api提供的containsKey(): 方法2:循环遍历,逐个比较. java相关视频推荐:java视频 具体实现代码如 ...

  7. Java黑皮书课后题第5章:*5.43(数学:组合)编写程序,显示从整数1到7中选择两个数字的所有组合,同时显示所有组合的总个数

    5.43(数学:组合)编写程序,显示从整数1到7中选择两个数字的所有组合,同时显示所有组合的总个数 题目 题目概述 破题 运行示例(要求) 代码 题目 题目概述 5.43(数学:组合)编写程序,显示从 ...

  8. Java黑皮书课后题第3章:**3.28(几何:两个矩形)编写一个程序,提示用户输入两个矩形中心的x坐标和y坐标以及矩形的宽度和高度,然后判断第二个矩形是在第一个矩形内,还是和第一个矩形重叠

    **3.28(几何:两个矩形)编写一个程序,提示用户输入两个矩形中心的x坐标和y坐标以及矩形的宽度和高度,然后判断第二个矩形是在第一个矩形内,还是和第一个矩形重叠 题目 题目概述 运行示例 破题 代码 ...

  9. (HDU4324)判断一个图中是否存在两点的出度相同

    题目:Triangle LOVE 因为每两个点一定有且仅有一条指向边,那么先假定点按顺序1,2,....n,每个点一定指向后面的点,即1指向2,3,4.....n,2指向3,4,5....n..... ...

最新文章

  1. Firefox无法加载12306自家证书
  2. BLE控制器之物理层特性
  3. python的类和实例化对象
  4. 如何将一个文件分割成多个小文件
  5. mysql技术分享-- 视图是什么
  6. 多个iframe同时加载并动态调整大小
  7. pitstop插件使用说明_【学员分享】程序员效率神器,最常用VIM插件安装大全
  8. 中国 人民大学计算机考研分数线,中国人民大学2010年计算机考研复试分数线
  9. scala List
  10. SAP License:SAP 移动类型详解
  11. win11beta渠道升级的如何改为正式版 Windows11beta版升级正式版的步骤方法
  12. Delphi Sockets.pas单元中TIpSocket的Bug
  13. mysql解压rpm文件在哪_[mysql] mysql 源码安装解压 rpm 包命令
  14. 如何获取html的页面宽度和高度,js获取屏幕,浏览器及网页的宽度和高度
  15. Chrome 配置samesite=none方式
  16. OIer__ZLY__OI计划
  17. Win10禁止Nvidia显卡驱动程序自动更新
  18. ppt中如何合并流程图_PPT流程图文件的合并
  19. 【DB笔试面试622】在Oracle中,说说COUNT(*)计算行数有哪些优化手段?
  20. 资产负债表与利润表钩稽关系

热门文章

  1. ASCII, LATIN1, UTF8 简介
  2. SharePoint 2010 PowerShell 系列
  3. yyyyMMddhhmmss(20140707103709)转换为yyyy-MM-dd HH:mm:ss(2014-07-07 10:37:09)
  4. ZYNQ MPSoc 多DMA传输实例
  5. Failed to include caffe_pb2, things might go wrong! ... TypeError: expected bytes, str found
  6. MO and MMO
  7. 《代码敲不队》第二次作业:团队项目选题报告
  8. 三维图像梯度 MATLAB
  9. 解决Bootstrap 附加导航(Affix)的问题和使用时若干注意事项
  10. 模型压缩:如何在压缩后保持模型的精度和速度