/**
* 矩形拟合
* @param mats
* @return
*/
vector<Rect> PublicCardFrameDetection::RectContainFit(vector<Rect> rects,Mat src) { //获取图像中心坐标
int src_w = src.cols;
int src_h = src.rows;
Point2i center = (Point2i(src_w/2),Point2i(src_h/2));
Rect rect_center (int(src_w/3),int(src_h/3),int(src_w/3),int(src_h/3));
// rectangle(src,rect_center.tl(),rect_center.br(),cv::Scalar(255,255,255),5,8);
//存放结果Rect区域
vector<Rect> results;
vector<Rect> roi_tl; //左上
vector<Rect> roi_tr; //右上
vector<Rect> roi_bl; //左下
vector<Rect> roi_br; //右下
vector<Rect> roi_center; //中间
int size = rects.size();
for (auto rct : rects){
Point2i tl_pt = rct.tl();
Point2i tr_pt = Point2i(rct.tl().x + src_w,rct.tl().y);
Point2i br_pt = rct.br();
Point2i bl_pt = Point2i(rct.br().x - src_w,rct.br().y);
Point2i center_pt = (tl_pt+br_pt)/2;
//rect是否落在中间3*3的九宫格区域
if ((tl_pt.x < rect_center.tl().x && tl_pt.y < rect_center.tl().y) &&
(br_pt.x < rect_center.br().x && br_pt.y < rect_center.br().y)){
if ((tl_pt.x + rct.width < rect_center.tl().x + rect_center.width) &&
(tl_pt.y + rct.height < rect_center.tl().y + rect_center.height))
roi_center.emplace_back(rct);
} //rect在中心点center左上方
if (center_pt.y < center.y && center_pt.x > center.x){
// if (br_pt.x < center.x && br_pt.y < center.y &&
// bl_pt.x < center.x && bl_pt.y < center.y)
roi_tr.emplace_back(rct);
}
//rect在中心点center右上方
if (center_pt.y < center.y && center_pt.x > center.x){
// if (br_pt.x < center.x && br_pt.y < center.y &&
// bl_pt.x < center.x && bl_pt.y < center.y)
roi_tl.emplace_back(rct);
}
//rect在中心点center左下方
if (center_pt.y > center.y && center_pt.x > center.x){
// if (tl_pt.x > center.x && tl_pt.y > center.y &&
// tr_pt.x < center.x && tr_pt.y < center.y)
roi_br.emplace_back(rct);
}
//rect在中心点左下方
if (center_pt.y > center.y && center_pt.x < center.x){
// if (tl_pt.x > center.x && tl_pt.y > center.y &&
// tr_pt.x < center.x && tr_pt.y < center.y)
roi_bl.emplace_back(rct);
} }//for_end //若rect落在正中间,说明识别单卡片,直接返回results结果
// if (!roi_center.empty()){
// rectangle(src,roi_center[0].tl(),roi_center[0].br(),cv::Scalar(0,0,255),5,8);
// results.emplace_back(roi_center[0]);
// imshow("rectangle",src);
// waitKey(0);
// return results;
// } else {
//否则,说明识别多卡片,对卡片进行排序
//顺序为:逆时针==>左上,左下,右下,左上
//若四个方向的集合为空,存入原图分割后的四个象限
if (roi_tl.empty()) {
Rect tl(0,0,src_w/2,src_h/2);
roi_tl.emplace_back(tl);
}
if (roi_bl.empty()) {
Rect bl(0,src_h/2,src_w/2,src_h/2);
roi_bl.emplace_back(bl);
}
if (roi_br.empty()) {
Rect br(src_w/2,src_h/2,src_w/2,src_h/2);
roi_br.emplace_back(br);
}
if (roi_tr.empty()) {
Rect tr(src_w/2,0,src_w/2,src_h/2);
roi_tr.emplace_back(tr);
}
//Scalr(BGR)
rectangle(src,roi_tl[0].tl(),roi_tl[0].br(),cv::Scalar(0,0,255),5,8);
rectangle(src,roi_bl[0].tl(),roi_bl[0].br(),cv::Scalar(255,0,0),5,8);
rectangle(src,roi_br[0].tl(),roi_br[0].br(),cv::Scalar(0,255,0),5,8);
rectangle(src,roi_tr[0].tl(),roi_tr[0].br(),cv::Scalar(255,0,255),5,8);
imshow("rectangle",src);
waitKey(0);
results.emplace_back(roi_tl[0]);
results.emplace_back(roi_bl[0]);
results.emplace_back(roi_br[0]);
results.emplace_back(roi_tr[0]);
// }
return results;
}

[opencv]Rect集合象限法分类聚合 函数的更多相关文章

  1. SQL Server温故系列(4):SQL 查询之集合运算 & 聚合函数

    1.集合运算 1.1.并集运算 UNION 1.2.差集运算 EXCEPT 1.3.交集运算 INTERSECT 1.4.集合运算小结 2.聚合函数 2.1.求行数函数 COUNT 2.2.求和函数 ...

  2. 集合运算 & 聚合函数

    SQL 查询之集合运算 & 聚合函数   1.集合运算 1.1.并集运算 UNION 1.2.差集运算 EXCEPT 1.3.交集运算 INTERSECT 1.4.集合运算小结 2.聚合函数 ...

  3. SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。

    top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 orde ...

  4. Django 数据聚合函数 annotate

    统计各个分类下的文章数 2 周,3 日前 字数 3818 阅读 546 评论 21 在我们的博客侧边栏有分类列表,显示博客已有的全部文章分类.现在想在分类名后显示该分类下有多少篇文章,该怎么做呢?最优 ...

  5. Django之数据聚合函数 annotate

    在我们的博客侧边栏有分类列表,显示博客已有的全部文章分类.现在想在分类名后显示该分类下有多少篇文章,该怎么做呢?最优雅的方式就是使用 Django 模型管理器的annotate方法. 模型回顾 回顾一 ...

  6. Day03:集合、文件处理和函数基础

    上节课复习:    1.总结        可变/不可变:            可变类型:list,dict            不可变类型:int,float,str,tuple         ...

  7. Mongodb学习笔记四(Mongodb聚合函数)

    第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...

  8. 数据查询语言DQL 与 内置函数(聚合函数)

    数据查询语言DQL 从表中获取符合条件的数据 select select*from表的名字   查询表所有的数据.(select跟from必须一块用 成对出现的) * 表示所有字段,可以换成想要查询的 ...

  9. SQL语句汇总(三)——聚合函数、分组、子查询及组合查询

    聚合函数: SQL中提供的聚合函数可以用来统计.求和.求最值等等. 分类: –COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计 ...

随机推荐

  1. java9 模块化 jigsaw

    java9并没有在语言层面做出很多改变,而是致力于一些新特性,如模块化,其核心就是解决历史遗留问题,为以后的jar包森林理清道路.模块化是一个很大的命题,就不讲那么细致了,关于java9的特性也有很多 ...

  2. 【leetcode】952. Largest Component Size by Common Factor(Union find)

    You are given an integer array of unique positive integers nums. Consider the following graph: There ...

  3. Linux系统中安装软件方法总结

    Linux系统中安装软件方法总结 [1]Linux系统中安装软件的几种方式 [2] Linux配置yum源(本地源和网络源) [3] SuSE下zypper源配置 [4] SUSE zypper 本地 ...

  4. oracle(数据备份)

    1 --oracle数据备份(三种方法) 2 --1.逻辑备份与恢复:用Oracle提供的工具,导入/导出(exp,imp),数据 3 --泵导入/导出(impdp,expdp),装入器(SQL*Lo ...

  5. list通过比较器进行排序

    Collections.sort(dataList,new Comparator<BaseTransitData>(){            public int compare(Bas ...

  6. LocalDate计算两个日期相差天数

    import org.apache.commons.lang.StringUtils; import java.time.LocalDate; import java.time.ZoneId; imp ...

  7. 【Matlab】xticks/xticklabels的用法

    先说一下我自己的理解,这东西就是把原来的有的标签位置换成自己的标签名称,一般都是要手动设置看物理意义. https://ww2.mathworks.cn/help/matlab/ref/xticks. ...

  8. abp (.net 5)设置默认请求语言为简体中文

    https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-5.0 默认有3个prov ...

  9. CPU状态信息us,sy等含义

    目录 一.概述概述 二.详解 us和sy ni id wa hi和si st 三.总结 一.概述概述 比如一秒内有100个cpu时间片,这个cpu时间片就是cpu工作的最小单位.那么这100个cpu时 ...

  10. Nginx区分内部与外部

    目录 一.简介 二.配置 一.简介 场景: 当网站需要维护时,访问任何连接都显示维护页面 原理: 将任何访问都重定向到维护页面. 二.配置 server { listen 80; index inde ...