C++ 判断一幅图片中的两个矩形区域是否邻近
应用:
存在于一幅图片中的两个矩形区域,计算其距离并判断其是否邻近。邻近则返回真,否则返回假。
(注:我在此处存储单个矩形的数据格式为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++ 判断一幅图片中的两个矩形区域是否邻近相关推荐
- 从给定的大图中切出指定矩形区域的小图
UIImage *image1 = [UIImage imageNamed:@"1.png"]; CGRect. rect = CGRectMake(0, 0,100,100);C ...
- 如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录
如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录 目录
- Python编程语言学习:python的列表的特殊应用之一行命令实现if判断中的两类判断
Python编程语言学习:python的列表的特殊应用之一行命令实现if判断中的两类判断 目录 python的列表的特殊应用 一行命令实现if判断中的两类判断 python的列表的特殊应用 一行命令实 ...
- 给定一个字符串,判断该字符串中是否包含某个子串.如果包含,求出子串的所有出现位置. 要求:从键盘输入两个字符串,第一个是给定的字符串,第二个是子串。
给定一个字符串,判断该字符串中是否包含某个子串.如果包含,求出子串的所有出现位置. 要求:从键盘输入两个字符串,第一个是给定的字符串,第二个是子串. 输入 abcd23abc34bcd bc 输出 1 ...
- excel中对比两个sheet,找出匹配不上的
问题描述:数据的特点是,在同一个excel文件中存在两个sheet,他们的数据结构是一样的,其中一个中的数据是另一个的子集,目的是要找出他们的不同,即找出在那张大些的sheet中存在,但在那张小些的s ...
- java map key是否存在_java中如何判断map集合中是否存在key
有两种方法可以判断map集合中是否存在某个key. 方法1:直接使用java api提供的containsKey(): 方法2:循环遍历,逐个比较. java相关视频推荐:java视频 具体实现代码如 ...
- Java黑皮书课后题第5章:*5.43(数学:组合)编写程序,显示从整数1到7中选择两个数字的所有组合,同时显示所有组合的总个数
5.43(数学:组合)编写程序,显示从整数1到7中选择两个数字的所有组合,同时显示所有组合的总个数 题目 题目概述 破题 运行示例(要求) 代码 题目 题目概述 5.43(数学:组合)编写程序,显示从 ...
- Java黑皮书课后题第3章:**3.28(几何:两个矩形)编写一个程序,提示用户输入两个矩形中心的x坐标和y坐标以及矩形的宽度和高度,然后判断第二个矩形是在第一个矩形内,还是和第一个矩形重叠
**3.28(几何:两个矩形)编写一个程序,提示用户输入两个矩形中心的x坐标和y坐标以及矩形的宽度和高度,然后判断第二个矩形是在第一个矩形内,还是和第一个矩形重叠 题目 题目概述 运行示例 破题 代码 ...
- (HDU4324)判断一个图中是否存在两点的出度相同
题目:Triangle LOVE 因为每两个点一定有且仅有一条指向边,那么先假定点按顺序1,2,....n,每个点一定指向后面的点,即1指向2,3,4.....n,2指向3,4,5....n..... ...
最新文章
- Firefox无法加载12306自家证书
- BLE控制器之物理层特性
- python的类和实例化对象
- 如何将一个文件分割成多个小文件
- mysql技术分享-- 视图是什么
- 多个iframe同时加载并动态调整大小
- pitstop插件使用说明_【学员分享】程序员效率神器,最常用VIM插件安装大全
- 中国 人民大学计算机考研分数线,中国人民大学2010年计算机考研复试分数线
- scala List
- SAP License:SAP 移动类型详解
- win11beta渠道升级的如何改为正式版 Windows11beta版升级正式版的步骤方法
- Delphi Sockets.pas单元中TIpSocket的Bug
- mysql解压rpm文件在哪_[mysql] mysql 源码安装解压 rpm 包命令
- 如何获取html的页面宽度和高度,js获取屏幕,浏览器及网页的宽度和高度
- Chrome 配置samesite=none方式
- OIer__ZLY__OI计划
- Win10禁止Nvidia显卡驱动程序自动更新
- ppt中如何合并流程图_PPT流程图文件的合并
- 【DB笔试面试622】在Oracle中,说说COUNT(*)计算行数有哪些优化手段?
- 资产负债表与利润表钩稽关系
热门文章
- ASCII, LATIN1, UTF8 简介
- SharePoint 2010 PowerShell 系列
- yyyyMMddhhmmss(20140707103709)转换为yyyy-MM-dd HH:mm:ss(2014-07-07 10:37:09)
- ZYNQ MPSoc 多DMA传输实例
- Failed to include caffe_pb2, things might go wrong! ... TypeError: expected bytes, str found
- MO and MMO
- 《代码敲不队》第二次作业:团队项目选题报告
- 三维图像梯度 MATLAB
- 解决Bootstrap 附加导航(Affix)的问题和使用时若干注意事项
- 模型压缩:如何在压缩后保持模型的精度和速度